关于网友提出的“ 百分求解: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