最终还是由FindResource或FindResourceEx完成,看第一个参数:传入的就是DLL或主进程EXE模块句柄.
至于方法2,3为何不成功, 得看MFC源码, 如果FindResource仍然用主进程EXE句柄, 就不正确.

解决方案 »

  1.   

    因为这不只是资源的问题,MFC内部还需要用到很多全局变量,对于MFC规则DLL,如果使用共享DLL中的MFC方式,必须加AFX_MANAGE_STATE。
      

  2.   

    DLL中的资源ID同 执行程序中的资源ID尽量不要相同,另外,可以尝试在执行程序中的*.rc2中包含DLL的资源 文件 *.rc
      

  3.   

    你做的这个例子是将对话框封装到DLL里吧?
    http://www.vckbase.com/document/viewdoc/?id=543
      

  4.   

    MFC规则DLL就用方法一,知道正确的方法最重要。方法二、三请确认用到的资源句柄是否正确。
      

  5.   


    MFC规则共享DLL用方法一有些不足,所以才考虑用方法二与方法三,方法一不足是因为方法一不够灵活,我发现通过方法一设置模块句柄后,对DLL的操作整过过程似乎都只能使用AFX_MANAGE_STATE(AfxGetStaticModuleState())设置的模块句柄了(也即DLL自身的句柄),我想再在DLL内使用EXE的句柄,加载来自EXE的资源怎么都不成功。
    比如我一开始用:
    AFX_MANAGE_STATE(AfxGetStaticModuleState())在接口函数切换模块句柄时,然后DLL内部再用下面两函数获取一幅来自EXE的位图,LoadImage函数返回的句柄总是空。这是什么啊?void CMsgDialog::SetAdBtm(UINT BmpAD)//获取广告位图。
    {
    HBITMAP hBmpAD = NULL;
    HINSTANCE hInstResource    = NULL; // 寻找正确的位图资源所在的模块句柄
    hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(BmpAD), RT_BITMAP); // Load bitmap Handle
    hBmpAD = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(BmpAD), IMAGE_BITMAP, 0, 0, 0); SetAdBtm(hBmpAD);
    }void CMsgDialog::SetAdBtm(HBITMAP hBmpAD)
    {
    m_hBmpAD=hBmpAD;
    }