如何正确处理DLL中的资源问题?

Tasehouny 2001-07-12 01:19:55
主程序载入一扩展MFC的DLL,如何才能保证,使用DLL中的资源和主程序中定义的资源不冲突?
例如资源的ID和主程序的资源ID重复?
...全文
283 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
plato 2001-07-12
  • 打赏
  • 举报
回复
不要用MFC,一切OK
c_z_y 2001-07-12
  • 打赏
  • 举报
回复
怎样从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()中,这时对话框的模板等已经读出了.



flagfly 2001-07-12
  • 打赏
  • 举报
回复
这样吧,去msdn中看看AFX_MANAGE_STATE(AfxGetStaticModuleState());
的说明,了解一下module state,问题就解决了。
我认为一点关系也没有
verybigbug 2001-07-12
  • 打赏
  • 举报
回复
开玩笑,根本就一点关系也没有。重复当然没关系呀。
用资源的话,LoadIcon(hInst, nID);这里的hInst为Dll的HINSTANCE就
表明用的是DLL中的资源,和Exe的有什么关系?
用Exe的资源时,hInst为Exe的HINSTANCE就可以了.
很多的DLL的话,每个DLL的hInst都不同,怎么会有关系呢!!!!!!

Tasehouny 2001-07-12
  • 打赏
  • 举报
回复
TO:AriDo(AriDo) 
AfxSetResourceHandle ,给个例子。

BTW:xxxbird(*说你行,你就行,不行也行*)
重复肯定崩溃!
如果是我自己写EXE和DLL,我能保证不重复,但要是别人写的DLL ,怎么办,比如说,我提供SDK,难道说别人写一个DLL因为ID重复导致我的EXE 崩溃?

所以分配资源空间一说,不合理,如果有很多个DLL,并且是不同的人写的?该怎么办?
oceanheart 2001-07-12
  • 打赏
  • 举报
回复
有多种解决方法:当主程序和DLL存在相同ID的资源时,缺省情况下是先查找主程序的资源,如果没有才查找DLL的资源.在DLL中可以通过改变这种缺省的查找顺序来解决冲突问题,在使用完后再将查找顺序改回去.另一种方法是人工修改或通过一些工具修改ID保证不重.在www.codeguru.com上有大量的例子和详细的描述,可以找一下.
wolfman 2001-07-12
  • 打赏
  • 举报
回复
你在设计dll的时候如何知道exe是怎么设计的,但你设计exe的时候却知道dll是怎样的。
只要你把你的dll的资源暴露出来,比如说提供你的"resource.h",改一个名,在exe工程中一起包含进来。
为了避免冲突,你在设计dll的时候,将资源id的值全部增大。留出一定的空间给exe。
AriDo 2001-07-12
  • 打赏
  • 举报
回复
AfxSetResourceHandle
xxxbird 2001-07-12
  • 打赏
  • 举报
回复

就是有重复也没有关系吧? 否则别人都不活了 ?!

glhorse 2001-07-12
  • 打赏
  • 举报
回复
,.,
big_tian 2001-07-12
  • 打赏
  • 举报
回复
gz
verybigbug 2001-07-12
  • 打赏
  • 举报
回复
To:c_z_y(用力)
在MFC中也不用这么复杂,用AFX_EXT_CLASS听说可以。:)我不用MFC
来工作的。只用来做Sample。

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧