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一般用动态

 

posted @ 2020-05-26 16:18  Wings_shadow  阅读(808)  评论(0编辑  收藏  举报