您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 百分求解:dll中domodal找不到所需资源

百分求解:dll中domodal找不到所需资源

来源:网络整理     时间:2016/7/9 1:30:27     关键词:

关于网友提出的“ 百分求解:dll中domodal找不到所需资源”问题疑问,本网通过在网上对“ 百分求解:dll中domodal找不到所需资源”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 百分求解:dll中domodal找不到所需资源
描述:

工作需要,
我为做了一个库,该库重写了一个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:

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

解决方案2:

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

解决方案3:

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

解决方案4:

需要使用 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
 

解决方案5:

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

解决方案6:

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


以上介绍了“ 百分求解:dll中domodal找不到所需资源”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2438013.html

相关图片

相关文章