荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店