你在设计dll的时候如何知道exe是怎么设计的,但你设计exe的时候却知道dll是怎样的。
只要你把你的dll的资源暴露出来,比如说提供你的"resource.h",改一个名,在exe工程中一起包含进来。
为了避免冲突,你在设计dll的时候,将资源id的值全部增大。留出一定的空间给exe。

解决方案 »

  1.   

    有多种解决方法:当主程序和DLL存在相同ID的资源时,缺省情况下是先查找主程序的资源,如果没有才查找DLL的资源.在DLL中可以通过改变这种缺省的查找顺序来解决冲突问题,在使用完后再将查找顺序改回去.另一种方法是人工修改或通过一些工具修改ID保证不重.在www.codeguru.com上有大量的例子和详细的描述,可以找一下.
      

  2.   

    TO:AriDo(AriDo) 
    AfxSetResourceHandle ,给个例子。BTW:xxxbird(*说你行,你就行,不行也行*)
    重复肯定崩溃!
    如果是我自己写EXE和DLL,我能保证不重复,但要是别人写的DLL ,怎么办,比如说,我提供SDK,难道说别人写一个DLL因为ID重复导致我的EXE 崩溃?所以分配资源空间一说,不合理,如果有很多个DLL,并且是不同的人写的?该怎么办?
      

  3.   

    开玩笑,根本就一点关系也没有。重复当然没关系呀。
    用资源的话,LoadIcon(hInst, nID);这里的hInst为Dll的HINSTANCE就
    表明用的是DLL中的资源,和Exe的有什么关系?
    用Exe的资源时,hInst为Exe的HINSTANCE就可以了.
    很多的DLL的话,每个DLL的hInst都不同,怎么会有关系呢!!!!!!
      

  4.   

    这样吧,去msdn中看看AFX_MANAGE_STATE(AfxGetStaticModuleState());
    的说明,了解一下module state,问题就解决了。
    我认为一点关系也没有
      

  5.   

    怎样从MFC扩展动态链结库(DLL)中显示一个对话框?
     我在过去的几天中试着在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()中,这时对话框的模板等已经读出了.
     
      

  6.   

    To:c_z_y(用力)
    在MFC中也不用这么复杂,用AFX_EXT_CLASS听说可以。:)我不用MFC
    来工作的。只用来做Sample。