荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Deny (I like), 信区: Program
标  题: 怎样从MFC扩展动态链结库(DLL)中显示一个对话框?
发信站: 荔园晨风BBS站 (Thu May 24 14:36:39 2001), 转信

怎样从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()中,这时对话框的模板等已经读出了.

--
所 为
精诚所致,金石为开精诚所致,金石为开 精诚所致,金石为开

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.247]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店