2014-10-05 34 views
1

我有这个MFC应用程序使用CString :: LoadString函数从字符串资源加载字符串。每个应用程序对话框的类及其关联的资源都包含在MFC扩展DLL中。为什么它CString :: LoadString在我的应用程序的主模块(.exe)中工作,但不会在我的extensionDLL中工作?

CString :: LoadString成功从主模块的(.exe)资源的字符串资源加载字符串,但无法从DLL资源的字符串资源加载字符串。

在每一种情况下,我得到我从CWinApp对象负载字符串实例句柄调用: 的CWinApp * WinApp = AfxGetApp(), 当然实例的句柄WinApp-> m_hInstance我作为第一个参数使用我对CString :: LoadString函数的调用。

可能是什么原因以及可能的解决方案。

+3

可能重复的[MFC LoadString in dll failed](http://stackoverflow.com/questions/1170533/mfc-loadstring-in-dll-fails) – wimh 2014-10-05 12:55:27

+1

http://stackoverflow.com/questions/9062034/what -does-AFX-管理-stateafxgetstaticmodulestate-DO-准确 – 2014-10-05 13:50:21

回答

1

您是否在传递EXE的HINSTANCE以从扩展库加载字符串?听起来很像。

使用MFC,如果你有扩展库,并且你确定你的字符串标识符是唯一的,你只需要调用CString :: LoadString(UINT nID)版本。由于扩展库创建了进入全局链表的CDynLinkLibrary结构,因此LoadString(UINT)函数将搜索所有MFC库,直到找到包含该字符串的HINSTANCE,然后它将从那里加载。如果您坚持使用带有HINSTANCE参数的LoadString()函数,请务必使用扩展DLL的HINSTANCE,而不是当您要从DLL加载字符串或对话框时EXE的扩展名。

对于小型项目,例如少于十几个DLL,您可能会设法为每件事物使用唯一的ID。当你进入超过100个DLL的疯狂大型项目时,你必须使用其他技术,例如DLL中调用AfxSetResourceHandle()的专门命名函数或知道总是使用DLL的HINSTANCE。这是另一个话题。

0

只是为了补充乔Willcoxson的回答,请务必确认您使用的每一个MFC扩展DLL,需要一个特殊的初始化代码,类似于下面的例子:

#include "stdafx.h" 
#include <afxdllx.h> 

static AFX_EXTENSION_MODULE MyExtDLL = { NULL, NULL }; 

extern "C" int APIENTRY 
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 
{ 
    if (dwReason == DLL_PROCESS_ATTACH) 
    { 
     TRACE0("MyExt.DLL Initializing!\n"); 

     // Extension DLL one-time initialization 
     if (!AfxInitExtensionModule(MyExtDLL, hInstance)) 
      return 0; 
     new CDynLinkLibrary(MyExtDLL); 
    } 
    else if (dwReason == DLL_PROCESS_DETACH) 
    { 
     TRACE0("MyExt.DLL Terminating!\n"); 
     // Terminate the library before destructors are called 
     AfxTermExtensionModule(MyExtDLL); 
    } 
    return 1; // ok 
} 

此代码只是照顾CDynLinkLibrary的创建,在MFC模块之间共享资源的关键。

如果这一切都设置正确 - 并且没有ID的冲突 - 那么它只是调用的马瑟:

CString; 
s.LoadString(IDS_MY_STRING_ID); 

在你的代码的任何地方,无论身在何处的字符串实际上仍然存在。

link中可找到有关资源ID和编号的良好起点。

相关问题