Windows核心编程——MFC DLL
1.MFC DLL
在DLL中使用MFC框架
1)规则DLL(MFC静态库版本和MFC动态库版本)
dll的接口是标准的接口,可以给SDK使用,也可也给MFC使用。
loadicon
loadmenu
loadimage
loadcursor
LoadAccelerators
这些都是加载资源的api,为何第一个都是实例句柄(模块在进程基址空间首地址)?
当一个进程启动时:存在exe和dll代码,这些代码从哪里来呢?
是来自于磁盘上的exe和dll,这些进程还会加载各种资源,资源也是在dll的地址空间中,也是来自于磁盘上的exe,编译时都会编译至磁盘的exe或dll里面。当exe启动时,磁盘的exe或dll都会“拷贝”至进程的exe和dll里边,在进程需要加载资源时,exe和dll可能都有资源,为了区分加载的是exe还是某个dl,所以需要实例句柄(模块基质)来区分。
使用Dll的任何资源之前要设置模块句柄
AFX_MANAGE_STATE(AfxGetStaticModuleState());
生成dll时需导出
控制台使用共享dll:
void MyShowDialog(); #pragma comment(lib, "..\\debug\\regulardllshared.lib") int main() { MyShowDialog(); return 0; }
MFC中使用共享dll
添加按钮后:
void MyShowDialog(); #pragma comment(lib, "..\\debug\\regulardllshared.lib") void CMFCUseDllDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 MyShowDialog(); }
再按钮中可以使用dll
2.静态加载Dll
注意:动态dll需要句柄:AFX_MANAGE_STATE(AfxGetStaticModuleState());
静态不需要
静态
动态
为什么动态加载dll需要切句柄呢?
我们来看这两个dll,静态dll大小远大于动态dll,而且大很多,为什么大呢?
由于静态dll用的是mfc静态库,mfc整个框架代码都进了dll里面。所以静态库的初始化已经再框架中做好,但是动态dll没有初始化,所以需要手动添加句柄去切换
3)扩展dll
导出mfc类,给mfc工程使用
使用mfc dll创建
加上导出宏:AFX_EXT_CLASS
使用dll:
#include "..\\ExternDll\\MyEdit.h" #pragma comment(lib, "..\\debug\\externdll.lib")dll需要切句柄呢?
注意:使用dll,字符集一致, 都是用共享mfc dll链接的方式。(库要一致)
一般直接用静态dll,让别人用着比较方便。扩展dll一般用动态