你在设计dll的时候如何知道exe是怎么设计的,但你设计exe的时候却知道dll是怎样的。
只要你把你的dll的资源暴露出来,比如说提供你的"resource.h",改一个名,在exe工程中一起包含进来。
为了避免冲突,你在设计dll的时候,将资源id的值全部增大。留出一定的空间给exe。
只要你把你的dll的资源暴露出来,比如说提供你的"resource.h",改一个名,在exe工程中一起包含进来。
为了避免冲突,你在设计dll的时候,将资源id的值全部增大。留出一定的空间给exe。
AfxSetResourceHandle ,给个例子。BTW:xxxbird(*说你行,你就行,不行也行*)
重复肯定崩溃!
如果是我自己写EXE和DLL,我能保证不重复,但要是别人写的DLL ,怎么办,比如说,我提供SDK,难道说别人写一个DLL因为ID重复导致我的EXE 崩溃?所以分配资源空间一说,不合理,如果有很多个DLL,并且是不同的人写的?该怎么办?
用资源的话,LoadIcon(hInst, nID);这里的hInst为Dll的HINSTANCE就
表明用的是DLL中的资源,和Exe的有什么关系?
用Exe的资源时,hInst为Exe的HINSTANCE就可以了.
很多的DLL的话,每个DLL的hInst都不同,怎么会有关系呢!!!!!!
的说明,了解一下module state,问题就解决了。
我认为一点关系也没有
我在过去的几天中试着在DLL中定义的函数中显示一个对话框,可是已经在DLL中定义好的对话框资源,在常规DLL调用时,我可以正常的显示出来,为什么在扩展DLL中同样的资源我却不能显示.当你在DLL中使用资源时,有些小细节需要注意,首先,在DLL运行时,必须保存DLL的实例,可以通过AfxInitExtensionModulestatic 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()中,这时对话框的模板等已经读出了.
在MFC中也不用这么复杂,用AFX_EXT_CLASS听说可以。:)我不用MFC
来工作的。只用来做Sample。