怎样从MFC扩展动态链结库(DLL)中显示一个对话框
问:我在过去的几天中试着在DLL中定义的函数中显示一个对话框,可是已
经在DLL中定义好的对话框资源,在常规DLL调用时,我可以正常的显示出来,
为什么在扩展DLL中同样的资源我却不能显示.
答:当你在DLL中使用资源时,有些小细节需要注意,首先,在DLL运行时,
必须保存DLL的实例,可以通过AfxInitExtensionModule
- static AFX_EXTENSION_MODULE extensionDLL;
- extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
- {
- if (dwReason == DLL_PROCESS_ATTACH)
- {
- // Extension DLL one-time initialization
- if (!AfxInitExtensionModule(extensionDLL, hInstance))
- return false;
- }
- return(true);
- }
然后,每次使用DLL资源时,你必须改变资源的句柄,使其指向DLL,并保
存exe的资源,以便以后正确恢复
- void get_DLL_resource(void)
- {
- /* this function changes the resource handle to that of the DLL */
- //这个函数改变资源句柄使其指向DLL
- if (resource_counter == 0)
- {
- save_hInstance = AfxGetResourceHandle();
- AfxSetResourceHandle(extensionDLL.hModule);
- }
- resource_counter++;
- }
接着你需要其它函数来恢复资源句柄
- void reset_DLL_resource(void)
- {
- /* this function restores the resource handle set by 'get_DLL_resource()' */
- if (resource_counter > 0)
- resource_counter--;
- if (resource_counter == 0)
- AfxSetResourceHandle(save_hInstance);
- }
接下来一点非常重要,只要有可能就必须恢复资源句柄,否则,你将会遇到许多问题.原因是可执行文件必须重画工具条等等,比如说,如果用户移动DLL的对话框,如果资源句柄仍然为DLL的资源,程序就崩溃了,我发现最好恢复句柄的时机在对话框的OnInitDialog()中,这时对话框的模板等已经读出了.
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 Web@Cool02.com
文章标题:怎样从MFC扩展动态链结库(DLL)中显示一个对话框
文章字数:488
本文作者:零贰
发布时间:2009-05-10, 05:58:54
最后更新:2020-03-25, 18:28:31
原始链接:/html/20090510055854.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。