MFC动态链接库和WIN32动态链接库 及区别
(1)DLL的构成 每个应用程序都有一个入口函数WinMain,而每个DLL也有一个入口函数DllMain。DLL跟应用程序一样都含有资源、数据段和代码段。DLL跟应用程序的差别主要是DLL有符号输入表和符号输出表,以方便应用程序调用DLL中的函数。 因为DLL是由应用程序加载的,所以它本身没有虚拟的内存地址空间,它使用的是加载它的应用程序的地址空间。这种加载分为隐式和显式两种方式。将在后面叙述。 (2)创建MFC DLL A,VC6新建一个工程MFCDLL,类型为MFCAppWizard(dll),具体选项为Regular DLL using shared MFC DLL。我们在MFCDLL.cpp的末尾添加实现代码如下: int sum(int a,int b) B,使用时,动态链接库的函数申明是写在def文件中,编译器根据这个文件的函数申明来生成lib文件和dll文件。我们只需要在MFCDLL.def文件的末尾添加代码如下: sum@1; 以上两步完成后,即可编译生成DLL了,总共生成MFCDLL.dll和MFCDLL.lib两个文件。DLL本身不能运行,所以还需要一个测试程序。 C,隐式加载MFC DLL并测试 用VC创建一个对话框工程testDlg,加上“测试加法”“测试减法”两个按钮。隐式加载需要在testDlg头文件头部添加代码申明: #pragma comment(lib,"MFCDLL") 编译时,需要将MFCDLL.lib拷贝到test工程目录下(dll可有可没有),否则会有错误提示:cannot open file "MFCDLL.lib"。在保证编译成功后,直接点击运行EXE也是无法成功的,会提示无法找到MFCDLL.dll文件。这个时候需要将MFCDLL.dll拷贝到跟EXE同层的目录。 给对话框按钮添加的代码如下: void CDLLtestDlg::OnSum() void CDLLtestDlg::OnSub() 用VC创建一个对话框,放置如上的“测试加法”和“测试减法”的按钮。采用显式加载DLL法,需要添加一个句柄来存储加载DLL的返回值,还要定义带参数的指针类型存储获得的两个函数地址typedef int (*PFUNC)(int,int);,在对话框头文件的类中如下: public: 在对话框的初始化中添加DLL加载过程: hDllLib = LoadLibrary("MFCDLL.dll"); m_pSum = (PFUNC)GetProcAddress(hDllLib,"sum"); //强制类型转换一定要加,GetProcAddress默认返回不带参数的函数指针 为了完整性,在对话框的WM_DESTORY消息的响应函数OnDestroy()中添加: FreeLibrary(hDllLib); 这样,两个按钮的操作如下: void CMFCDLLtest2Dlg::OnSum() int value = m_pSum(10,255);border-width:0px;list-style:none;">void CMFCDLLtest2Dlg::OnSub() (3)WIN32 DLL说明 WIN32 DLL与MFC DLL的差别在于它的DllMain不是打包的,是可见的。它同样其中定义函数实体,不过在头文件中都需要申明(申明语句是特定的,如extern "C" __declspec( dllexport ) )。缺省的入口函数如下: BOOL APIENTRY DllMain( HANDLE hModule, DllMain负责初始化和结束工作。 hModule是动态库被调用时所传递过来的一个指向自己的句柄; ul_reason_for_call是一个说明动态库被调用原因的标志。当进程或者线程装载、卸载动态链接库的时候,操作系统便调用入口函数。 lpReserved是一个被系统保留的参数 理解以上之后,就需要考虑输出函数的实现方法。 (4)创建WIN32 DLL A,用VC6创建一个WIN32DLL工程WIN32DLL,可以看出它默认用WIN32DLL_API这个符号输出一个变量nWIN32DLL 和一个函数fnWIN32DLL,而WIN32DLL_API相当于__declspec(dllexport)。类似,在对话框头文件中添加输出申明,同时需要特别关注的是在申明和定义前都要加extern "C"关键字,如果不加在隐式调用和显式调用时会出现异常状况: extern "C" WIN32DLL_API int sum(int a,int b); extern "C" WIN32DLL_API int sub(int a,255);border-width:0px;list-style:none;">编译就生成对应的LIB和DLL。 B,隐式加载WIN32 DLL并测试 利用第(2)步同样的隐式调用测试程序,就可以测试这个DLL。有点差别,就是头文件前也要加extern "C",否则编译错误。如下: exter
通过MFC创建DLL你必须链接MFC库,无论动态或静态,优点是如CString等,促使开发方便,缺点是静态链接臃肿,动态链接必须附带mfc库,部署不方便。
mfc使用mfc类库建立的dll 而win32是用win32函数建立的dll,
win32定义为 win98于win2000系统库函数,用的是标准的C接口 而mfc是对win32的进一步封装,他是从CWINAPP派生的,接口可以是扩展库 也可以是规则库 他们的通用性有点区别,win32更广泛,而mfc dll更方便,
如果你只想关心dll的实现,不想花心思去设计框架,MFC Dll就帮你做了。如果你觉得MFC好烦,什么细节都隐藏,到处都是宏定义,又不知所云;再者自己也想练练手,自己搭建一砖一瓦,那么选择Win32 Dll就是了。至于那些扩展的类,只要加上需要的头文件就能用了,没什么差别的。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows软件部署和修补工具
- windows phone 7 – 如何检查wp7中的InternetConnection?
- windows – 网卡绑定和EtherChannel
- windows-server-2008-r2 – Slipstream SP1到Windows Serve
- 如何检查Windows机器上的端口是否被阻止?
- windows – 在应用程序运行时替换.dll文件?
- windows – 测试用户帐户和密码的工具(测试登录)
- extjs – 如何在Ext.Window中播放flv文件?
- Windows下用批处理批量创建快捷方式并改名
- 我可以使用Win32 COM替换word文档中的文本吗?