MFC规则DLL

分为两类:
 (1)静态链接到MFC的规则DLL
    静态链接到MFC的规则DLL与MFC库静态链接,将MFC库的代码直接生产在.dll文件中。在调用这种DLL的接口时,MFC使用DLL的资源。因此,在静态链接到MFC的规则DLL中不需要进行模块状态的切换。
    使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
 (2)动态链接到MFC的规则DLL
   动态链接到MFC的规则DLL,可以和使用它的可执行文件同时链接到MFC DLL和MFC扩展DLL。在使用了MFC共享库的时候,默认情况吓,MFC使用主应用程序的资源句柄来加载资源模块。这样,当DLL和应用程序中存在相同ID的资源时(即所谓的资源重复问题),系统可能不能获得正确的资源。因此,对于共享MFC DLL的规则DLL,我们必须进行模块切换以使得MFC能够找到正确的资源模块。
   我们可以在project->setting->General中设置MFC规则DLL是静态链接到MFC DLL还是动态链接到MFC DLL。
  
   如果在所调用的DLL函数中使用了资源,则需要采用静态链接的方式,才能正确调用DLL函数;如果要采用动态链接,需要进行模块切换,模块切换的方法稍后即讲。
   如果所调用的DLL函数没有使用任何资源,则即使采用动态链接的方式,也不需要进行模块切换,和使用Win32 DLL一样。
 
   模块切换的方法:
(1)在DLL接口函数中使用:
     AFX_MANAGE_STAGE(AfxGetStaticModuleStatic());
     即在接口函数入口处加上该语句进行模块状态切换。
(2)在DLL接口函数中使用:
     AfxGetResourceHandle();
     AfxSetResourceHandle(HINSTANCE xxx);
     如下列代码:
void ShowDlg(void)
{
    HINSTANCE save_hInstance=AfxGetResourceHandle();
    AfxSetResourceHandle(theApp.m_hInstance);

    CDialog dlg(IDD_DLL_DIALOG);
    dlg.DoModal;

    AfxSetResourceHandle(save_hInstance);
}
(3)由调用DLL的应用程序自身切换
   资源模块的切换除了可以由DLL接口函数完成以外,由应用程序自身也能完成。

   //获取exe模块句柄
   HINSTANCE exe_hInstance = GetModuleHandle(NULL);
   //或者HINSTANCE exe_hInstance = AfxGetResourceHandle();

   //获取DLL模块句柄
   HINSTANCE dll_hInstance = GetModuleHandle("SharedDll.dll");

   //切换状态
   AfxSetResourceHandle(dll_hInstance);

   //调用DLL函数
   ShowDlg();

   //资源模块恢复
   AfxSetResourceHandle(exe_hInstance);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值