MFC之dll中调用对话框

来源:互联网 发布:淘宝网货到付款购物 编辑:程序博客网 时间:2024/05/16 15:57

文章出处:

http://blog.csdn.net/rockex/article/details/571758

http://blog.csdn.net/hd498222594/article/details/7030653

 一、dll部分

      同过VS向导建立一个MFC dll工程,在工程中创建自己的MFC类,来实现将要展示的界面。新建一个cpp工程,添加头文件#include "StdAfx.h"和界面类的头文件,然后使用下面语句来导出

     extern "C" __declspec(dllexport) void ShowDlg(void) 
     {
          AFX_MANAGE_STATE(AfxGetStaticModuleState());
          CXXDlg dlg;
           dlg.DoModal();//实现DLL资源切换的?AFX_MANAGE_STATE(AfxGetStaticModuleState());
       }

        其中CXXDlg是界面类,必须添加代码AFX_MANAGE_STATE(AfxGetStaticModuleState());
        作用:用于模块切换时的状态保护,

         1.AfxGetStaticModuleState()指向当前模块状态;

         2.当前函数调用结束后原模块的状态自动被恢复;

         3.用于DLL中所调用MFC函数、类、资源时的模块状态切换;

         也就是說,並不是每一个dll的输出函数前都要调用它,只有在要輸出對話框等用到資源時要調用!

         dll中资源是共享的用了这个函数的防止不同的进程修改资源产生错误!

         缺省情况下MFC使用主应用程序的资源句柄来载入资源模板,而DLL中的资源模板是存在于DLL模板中,因此要使用这一语句切换到

   二、调用dll

   采用如下代码调用dll并显示界面

   typedef void (*lpFun)(void);
   HINSTANCE hDll;
   hDll=LoadLibrary(L"XX.dll");
   if(NULL==hDll)
   {
       MessageBox(L"加载失败");
    }
   lpFun addFun;
   lpFun pShowDlg=(lpFun)GetProcAddress(hDll,"ShowDlg");
   if(pShowDlg==NULL)
   {
       MessageBox(L"加载失败");
   }
   pShowDlg();

   CloseHandle(hDll);
   其中XX.dll为dll的名称