2012-02-23 101 views
0

我正在加载一个卫星DLL,其中包含语言资源。但是,我只想将字符串存储在dll中,而不是对话框资源。我加载DLL如下:如何从EXE加载资源而不是DLL

hInst = LoadLibrary(_T("MyAppFRA.dll")); 
if (hInst!= NULL) 
    AfxSetResourceHandle(hInst); 

的问题是,如果我带来CTestDlg现在如下,它永远不会出现。

CTestDlg dlg; 
dlg.DoModal() 

这是因为对话框资源IDD_DIALOG1是那里的exe文件,但不能在DLL这样的DoModal()似乎无法找到它(为AfxSetResourceHandle()调用的结果)。这是故意的,我想如果它没有在dll中找到资源,它会自动查找exe,但似乎并非如此。

当我的其他资源位于dll中时,是否可以从exe资源加载对话框?

+0

对话框不包含任何文字吗?为什么他们不会被翻译呢? – 2012-02-23 23:07:03

+0

@MarkRansom他们这样做,我想从OnInitDialog()中的当前资源句柄中加载文本。这样我的对话框资源就被共享了,只有文本才会被翻译。 – zar 2012-02-24 02:05:34

+0

有时候布局需要改变,因为单词比英语长或短。但如果它适合你,我不会抱怨。 – 2012-02-24 02:10:57

回答

0

我们有一个巨大的应用程序,遍布各地的资源。只要您想更改MFC查找资源的上下文,就可以使用AfxSetResourceHandle()。我们有一个基于堆栈的对象,它允许我们设置资源句柄然后恢复它。 AfxGetResourceHandle()是获取当前值的函数。

+0

如果您愿意在您的OnInitDialog中调用AfxSetResourceHandle,则此方法有效。 – 2012-02-24 02:12:11

+0

@MarkRansom这意味着我必须来回改变上下文,这将是很多地方,这是不受欢迎的。我正在通过[this](http://msdn.microsoft.com/en-us/library/8fkteez0%28vs.71%29.aspx)Microsoft说:“如果MFC没有找到任何附属DLL,它会使用任何资源包含在应用程序本身中。“但我想emphsis是'没有找到卫星DLL',而不是'DLL中的资源',所以我的解释是错误的。 – zar 2012-02-24 20:43:06

+0

那么,我已经重新读你的原始问题...我看到你正在使用LoadLibrary()手动加载DLL。 AfxSetResourceHandle()的东西被设计为适用于MFC扩展库。你是否将DLL作为扩展库构建?这将使MFC遍历DLL资源的方式发生变化。 如果将DLL设置为扩展库,资源的大问题不是无法找到资源,而是重复。如果你没有任何资源的重复,你永远不必担心调用AfxSetResourceHandle(),因为MFC应该找到一切正常 – 2012-02-27 21:12:57

0

您可以自己从.exe资源加载对话框模板,然后调用InitModalIndirect将其与对话框对象绑定。 DoModal将使用此资源而不是尝试从当前资源句柄加载一个资源句柄。