在Windows编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化Win32 API的使用。MFC扩展DLL是一种特殊的动态链接库(DLL),它允许我们导出MFC类,以便其他应用程序或DLL可以使用。本文将深入探讨如何一步步实现MFC扩展DLL中导出类和对话框。 我们需要了解MFC扩展DLL与常规DLL的区别。常规DLL通常不包含MFC的运行时环境,而MFC扩展DLL则包含了MFC的类库,这使得它可以直接使用MFC类,并且可以导出这些类供其他MFC应用程序使用。 **创建MFC扩展DLL** 1. **新建项目**:在Visual Studio中,选择“文件”->“新建”->“项目”,然后在模板中选择“MFC”类别下的“MFC扩展DLL”。给项目命名,例如“TestExportClass”。 2. **配置项目设置**:在项目属性中,确保“配置类型”设置为“动态库 (.dll)”,并且在“MFC支持”下选择“使用MFC作为共享DLL”。 3. **添加导出类**:在DLL中,你需要创建一个或多个类并导出它们。导出类的方法是在类定义前加上`DECLARE_DYNAMIC`和`IMPLEMENT_DYNAMIC`宏。例如,创建一个名为`CExportClass`的类: ```cpp class DECLARE_DYNAMIC(CExportClass) { public: CExportClass(); virtual ~CExportClass(); // 添加你的成员函数 void ExportedFunction(); }; ``` 然后,在实现文件中,使用`IMPLEMENT_DYNAMIC`宏: ```cpp CExportClass::CExportClass() {} CExportClass::~CExportClass() {} void CExportClass::ExportedFunction() { // 实现你的功能 } ``` **导出类的成员函数**:为了使类的成员函数在外部可调用,需要使用`AFX_DECL_DLL_EXPORT`或`AFX_DECL_DLL_IMPORT`宏。例如,对于`ExportedFunction`,添加`AFX_DECL_DLL_EXPORT`: ```cpp AFX_DECL_DLL_EXPORT void CExportClass::ExportedFunction() ``` **创建导出对话框**:MFC扩展DLL还可以导出对话框。创建一个基于`CDialog`的派生类,如`CMyDialog`。然后,像导出类一样,导出对话框的创建函数: ```cpp AFX_DECL_DLL_EXPORT CMyDialog* CreateMyDialog() { return new CMyDialog(); } ``` **使用DLL**:在使用MFC扩展DLL的应用程序中,需要包含DLL的头文件,并链接到相应的库。使用`AFX_MODULE_ID`来获取DLL的模块ID,以便正确地初始化MFC。 ```cpp extern AFX_MODULE_ID moduleID; // 获取模块ID AFX_MODULE_ID moduleID = AfxGetModuleState()->m_pModuleInfo->m_moduleID; // 使用DLL CExportClass* pExportClass = new CExportClass(); pExportClass->ExportedFunction(); // 创建并显示对话框 CMyDialog* pDialog = CreateMyDialog(); pDialog->DoModal(); ``` **编译和测试**:确保编译并链接DLL项目,然后将其复制到使用它的应用程序的可执行文件同一目录下。运行应用程序,通过调用DLL的导出函数和对话框,检查功能是否正常工作。 以上就是实现MFC扩展DLL中导出类和对话框的详细步骤。在实际开发中,可能还需要处理线程安全问题,考虑异常处理,以及根据需求优化性能。理解MFC扩展DLL的原理和使用方法,能帮助开发者更好地构建可复用和模块化的软件组件。
2025-06-27 13:14:29 19KB MFC扩展DLL
1
Delphi中制作DLL •一 Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。 二参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。 3 用stdcall声明后缀。 4 最好大小写敏感。 5 无须用far调用后缀,那只是为了与windows 16位程序兼容。 三 DLL的初始化和退出清理[如果需要初始化和退出清理] 1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进入时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_ATTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份, 但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据 传递,除非你用内存映像文件。 五、其他:调用方式按照标准的Windows调用方式. 六、关于参数传递 •Delphi程序之间调用DLL,如果要用String类型的话,要在引用的单元加上ShareMem 单元。 •如果Delphi写的DLL供其他开发工具使用的话,不要使用String类型,用PAnsiChar类型。 尽量使用标准DLL接口。指的是传递的参数类型及函数返回类型不能是Delphi特有的, 比如string(AnsiString),以及动态数组和含有这些类型成员的复合类型(如记录),也不 能是包含有这些类型成员数据成员的对象类型,以避免可能的错误。如果使用了string类型或 动态数组类型,且调用方不是Delphi程序,则基本上会报错。如果调用方是Delphi但调用方或 被调用方没有在工程文件的第一包含单元不是ShareMem,也可能会出错。 七、关于回调Funciton 你可以把Callback函数看作是一种特殊的消息响应函数,一般来说我们不会自己调用这种函数, 而是有某些系统函数调用,而且不需要向后传递消息。 只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++中回调函数并没有退出,反而得到延伸与 扩展,在面向对像中的回调,其实是指面向对像中类对像的事件,事件就是原始的回调函数。面 向对像, 将回调函数定义成事件过程,在程序引用对像时,若指定了对像的过程事件后,那么在 要进行事件触发的地方检查事件过程是否分配,如果分中的就执行事,也就是执行了回调函数。
2023-12-12 19:25:07 22KB
1
dll中包含窗体的调用实例,开发工具是delphi7,调用后是颜色交替变化
2023-09-26 10:02:55 333KB delphi dll form
1
调用dll中的窗体做子窗体,并将主程序中的 record传给dll
2023-09-26 10:00:07 358KB delphi dll 子窗体 传值
1
整理了从DLL文件中输出LIB文件的方法,包括输出VC的.lib后缀和GCC的.a后缀的连接文件,并建立一个批处理文件,方便转换操作
2023-03-08 19:40:00 1.16MB VC GCC 动态库 连接文件
1
用的编译器是devc++和vb6,用devc++打开.dev文件后编译得到dll,用vb6打开.vbp文件生成exe文件。资源中包含编译后的文件。
2022-12-21 09:00:43 289KB 代码 c vb
1
VC 6.0从Dll中获取 数据的实现方法,主要功能是调用Dll进程数,判断当前调用Dll的线程有多少个。显示当前调用了多少个进程:   CString strMessage = _T("");   strMessage.Format(_T("当前共%d个进程调用DLL。"), nCount);   AfxMessageBox(strMessage);   最终运行效果请参见截图所示。完整源代码码包括了DLL代码和Test测试源文件,请下载源码包。
2022-12-12 13:57:44 59KB VC 源码-系统相关
1
源码展示DLL的FORM模块入坞到主窗口,BPL的FORM入坞到主窗口,模块间共享数据库连接,调用DLL的主要事项,接口方法的应用等等。
2022-12-03 18:22:09 769KB BPL应用 DLL中FORM 共享数据库连接
1
这是从ccrun的手里得来的,调用DLL中MDI子窗体的实例
2022-11-27 12:10:51 529KB DLL MDI子窗体 bcb
1
vc在MFC扩展DLL中导出类,可以学习
2022-11-22 09:57:00 24KB vc MFC DLL
1