零贰'Blog

零贰'Blog - 记录日常点点滴滴..........

怎样从MFC扩展动态链结库(DLL)中显示一个对话框

DLLVC代码动态库源码

问:我在过去的几天中试着在DLL中定义的函数中显示一个对话框,可是已
经在DLL中定义好的对话框资源,在常规DLL调用时,我可以正常的显示出来,
为什么在扩展DLL中同样的资源我却不能显示.
答:当你在DLL中使用资源时,有些小细节需要注意,首先,在DLL运行时,
必须保存DLL的实例,可以通过AfxInitExtensionModule

  1. static AFX_EXTENSION_MODULE extensionDLL; 
  2. extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) 
  3.    if (dwReason == DLL_PROCESS_ATTACH) 
  4.       { 
  5.       // Extension DLL one-time initialization 
  6.       if (!AfxInitExtensionModule(extensionDLL, hInstance)) 
  7.          return false; 
  8.       } 
  9.    return(true); 

然后,每次使用DLL资源时,你必须改变资源的句柄,使其指向DLL,并保
存exe的资源,以便以后正确恢复

  1. void get_DLL_resource(void) 
  2.    /* this function changes the resource handle to that of the DLL */
  3.    //这个函数改变资源句柄使其指向DLL 
  4.    if (resource_counter == 0) 
  5.       { 
  6.       save_hInstance = AfxGetResourceHandle(); 
  7.       AfxSetResourceHandle(extensionDLL.hModule); 
  8.       } 
  9.    resource_counter++; 

接着你需要其它函数来恢复资源句柄

  1. void reset_DLL_resource(void) 
  2.    /* this function restores the resource handle set by 'get_DLL_resource()' */
  3.  
  4.    if (resource_counter > 0) 
  5.       resource_counter--; 
  6.    if (resource_counter == 0) 
  7.       AfxSetResourceHandle(save_hInstance); 

接下来一点非常重要,只要有可能就必须恢复资源句柄,否则,你将会遇到许多问题.原因是可执行文件必须重画工具条等等,比如说,如果用户移动DLL的对话框,如果资源句柄仍然为DLL的资源,程序就崩溃了,我发现最好恢复句柄的时机在对话框的OnInitDialog()中,这时对话框的模板等已经读出了.