工作需要,
我为做了一个库,该库重写了一个list空间,我们假设这个库名字就叫做ListLib该库是一个dll。我发现了如下问题:如果我这个dll创建成Regular DLL using shared MFC DLL 
或者Regular DLL with MFC statically linked ,
那么我在库中位CListCtrl子类控件所写的OnContextMenu响应函数中Modal一个对话框出来将会失败,如果Modal一个CPropertySheet出来一个属性表就会提示找不到所需资源。但是如果我将这个dll设置成MFC extension DLL 那么问题就能够得到解决。谁能够回复一下这个问题的根本原因是什么?示例代码如下:
void CListCBBCtrl2::OnContextMenu(CWnd* pWnd, CPoint pos)
{
CDlgOne dlg;
dlg.DoModal();
}void CListCtrlCBB::OnContextMenu(CWnd* pWnd, CPoint pos)
{
CPropertySheet sheet;
CPageOne pageone;
sheet.AddPage(&pageone);
sheet.DoModal();
}果dll创建时使用Regular DLL using shared MFC DLL 或者Regular DLL with MFC statically linked 
那么dlg.DoModal返回-1
而sheet.DoModal()提示找不到资源。谁能够回复一下我的问题?能不能介绍一下,创建三种不同dll的时候,
他们的资源是如何使用的?

解决方案 »

  1.   

    扩展MFC的时候有全局变量,设置了一些句柄。
    在之后的搜索资源的就能正确的从dll中读取,否则就是从exe中读取
      

  2.   

    因为MFC在默认资源模块中找不动对话框资源模板。可以用AfxSetResourceHandle设置对话框资源模板所在的模块为默认资源模块。
      

  3.   

    需要使用 AfxGetResourceHandle 和  AfxSetResourceHandle切换资源static AFX_EXTENSION_MODULE NEAR extensionDLL = { NULL, NULL };DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
    {
      if (dwReason == DLL_PROCESS_ATTACH)
      {
       // Extension DLL one-time initialization - do not allocate memory here,
       //   use the TRACE or ASSERT macros or call MessageBox
       if (!AfxInitExtensionModule(extensionDLL, hInstance))
        return 0;
       //
      }
      return 1;
    }
    //使用
      HINSTANCE hInstOld = AfxGetResourceHandle(); //save old resource chain
      AfxSetResourceHandle(extensionDLL.hModule); //set new resource module
      BOOL bRet = !m_menu.LoadMenu(IDR_MENU);
      AfxSetResourceHandle(hInstOld); //restore the old resource chain
     
      

  4.   

    在你dll需要使用资源的函数入口处加入AFX_MANAGE_STATE(AfxGetStaticModuleState());即可
      

  5.   

    当应用程序使用资源时,它按以下顺序查找资源:首先查找应用程序本身,看有没有对应的资源;如果没有,查找MFC400.DLL(或MFC400D.DLL,它包含调试信息)。再查找应用程序所带的动态连接库中的资源。如果想在DLL中直接使用资源而不经过以上搜索顺序,可以使用AfxGetResouceHandle()和AfxSetResourceHandle()函数。 AfxGetResourceHandle()和AfxSetResouceHandle()函数分别用来保存旧的资源句柄和设置新的资源句柄
      

  6.   

    这是因为DLL中和主程序中都有资源模块,如果在DLL中想使用资源,应该进行资源模块切换,使用如下语句:AFX_MANAGE_STATE(AfxGetStaticModuleState());另外,使用 2楼3楼的方法也可以。