如果别的应用程序要用到DLL中的资源,它必须知道资源的ID。这些ID是在DLL工程的Resource.h文件中定义的,因此另一个工程只需包含Resource.h文件即可,或者,将resource.h中定义的ID复制即可。
你所说的另一个工程包含了rc文件,其实本质上等于是包含resource.h文件——因为rc文件中必然有“#include "resource.h"”。

解决方案 »

  1.   

    感谢您使用微软产品。一般来说,在使用DLL中的对话框时,是不需要包括原DLL的".rc"文件的。
    您可以采用如下的方法实现:
    在一个MFC Extention DLL中为您的对话框资源模板定义一个CDialog的子类,并在一个接口函数中用DoModal()生成对话框。在您的应用程序中,您只需直接调用DLL中的接口函数就可以了。
    如果您有问题,请给出较详细代码以便大家为您解决。- 微软全球技术中心 VC技术支持本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
      

  2.   

    我的DLL并不是MFC Extention DLL,只是使用了MFC的标准DLL,在DLL中使用了对话框,而在应用程序中并不直接使用对话框,而是调用DLL的功能函数(该函数使用了对话框),所以并没有包含“#include "resource.h"”;
    另外,我说的“在工程设置里包含该DLL工程的".rc"文件”是指我发布DLL时需要同时发布我的".rc"文件,并在应用程序的工程设置的“Additional resource include directoris:”里增加其路径,不好意思,我没说明白;
    请问,可以有办法不须发布DLL的资源文件吗?
      

  3.   

    1用API来写,自己一个个Create控件
    2把对话框封在一个函数里面,像OPENFILENAME那样。
      

  4.   

    方法1.太......
    方法2.现在,我的对话框就是封装在函数里的,但没用
    我用VC以资源方式打开生成的DLL,发现里面有我加在DLL工程里的对话框资源,应用程序使用DLL编译链接均没问题,但一执行使用对话框的函数就死
      

  5.   

    BOOL WINAPI Login(PopeDom *LoginUser,int nRights,const char* szPrompt)
    {
    BOOL bRet; HINSTANCE hOldResHandle=AfxGetResourceHandle();
    HINSTANCE hInst = ::GetModuleHandle("SPub.dll");

    //把资源句柄指向本DLL。注意!这是必须的。否则构造对话框或引用资源时极可能会出错。
    AfxSetResourceHandle(hInst); CLoginDlg dlg(NULL,nRights,szPrompt,LoginUser);
    if(dlg.DoModal()==IDOK)
    bRet=TRUE;
    else
    bRet=FALSE;

    //恢复老的资源句柄。注意!这也是必须的。
    AfxSetResourceHandle(hOldResHandle);
    return bRet;
    }
      

  6.   

    iamshuke:你的方法在以下情况下好象不行
    1.多线程
    2.非模态窗口
    因为这两种情况都可能发生“把资源句柄指向DLL后,而又在恢复老的资源句柄之前,主程序弹出对话框引用老的资源句柄”的情况而出错,我的理解对吗?
      

  7.   

    我试了过,把资源句柄指向DLL后,宿主程序(调用DLL的应用程序)的对话框资源就无法使用了。而且这种方式只能用在模态对话框中,非模态对话框由于并非马上关闭,所以无法马上恢复老的资源句柄,所以还是无法解决我的问题。
    不过,有学了一招,非常感谢,给分
      

  8.   

    你可以在非模态对话框Create之后就恢复老的资源句柄.