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>