Login dark
author: 零贰
title: 怎样从MFC扩展动态链结库(DLL)中显示一个对话框
date: 2009-05-10 05:58:54
category: [编程代码]
tags: [DLL,VC,代码,动态库,源码]
feature: http://image.cool02.com/blogimages/code.jpg

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

<ol><li>static AFX_EXTENSION_MODULE extensionDLL;  <li>extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)  <li>{  <li>   if (dwReason == DLL_PROCESS_ATTACH)  <li>      {  <li>      // Extension DLL one-time initialization  <li>      if (!AfxInitExtensionModule(extensionDLL, hInstance))  <li>         return false;  <li>      }  <li>   return(true);  <li>}  </li></ol>
<p>然后,每次使用DLL资源时,你必须改变资源的句柄,使其指向DLL,并保
存exe的资源,以便以后正确恢复</p>
<ol><li>void get_DLL_resource(void)  <li>{  <li>   / this function changes the resource handle to that of the DLL / <li>   //这个函数改变资源句柄使其指向DLL  <li>   if (resource_counter == 0)  <li>      {  <li>      save_hInstance = AfxGetResourceHandle();  <li>      AfxSetResourceHandle(extensionDLL.hModule);  <li>      }  <li>   resource_counter++;  <li>}  </li></ol>
<p>接着你需要其它函数来恢复资源句柄</p>
<ol><li>void reset_DLL_resource(void)  <li>{  <li>   / this function restores the resource handle set by 'get_DLL_resource()' / <li> <li>   if (resource_counter > 0)  <li>      resource_counter--;  <li>   if (resource_counter == 0)  <li>      AfxSetResourceHandle(save_hInstance);  <li>}  </li></ol>
<p>接下来一点非常重要,只要有可能就必须恢复资源句柄,否则,你将会遇到许多问题.原因是可执行文件必须重画工具条等等,比如说,如果用户移动DLL的对话框,如果资源句柄仍然为DLL的资源,程序就崩溃了,我发现最好恢复句柄的时机在对话框的OnInitDialog()中,这时对话框的模板等已经读出了.</p>