在 Visual Studio 2012 中,如何将资源文件 (.rc) 与 c ++ dll 链接
Posted
技术标签:
【中文标题】在 Visual Studio 2012 中,如何将资源文件 (.rc) 与 c ++ dll 链接【英文标题】:In Visual Studio 2012, how can one link resource file(.rc) with c ++ dll 【发布时间】:2015-09-03 06:20:41 【问题描述】:我必须构建一个 c++ .dll,我需要在其中显示一个对话框 与用户互动的案例。所以我创建了一个资源文件(.rc), 在 dll 项目中集成相应代码以显示对话框和 用VS2012中的资源文件构建dll项目。
现在的问题是当我在另一个测试应用程序中加载 dll 并且 从 dll 调用其中一种方法,该方法使用资源文件来显示 对话框,此方法返回
错误 0x715 是 ERROR_RESOURCE_NAME_NOT_FOUND。**
dll中返回错误的行是
DialogBox(HInstance, MAKEINTRESOURCE(IDD_INPUTDIALOG), NULL, NotifyUser);
我的 DialogBox 资源文件 (.rc) 似乎带有 id: IDD_INPUTDIALOG 未链接或添加到 dll 中。所以它不能 找到对话框资源。
现在,如果我在测试应用程序中添加一个资源文件(.rc),其 id 与 dll 中的资源文件(.rc) 相同,则来自 dll 的方法调用使用资源文件( .rc) 在测试应用程序中,而不是在 dll 中。
那么是不是资源文件不喜欢或者不添加到dll中?
附加信息:
要使用资源文件构建dll,我使用VS2012,只需将资源文件添加到项目中,并将项目构建为动态链接库(.dll)。
在dll中添加资源文件是否足够,还是必须设置一些 使用 dll 链接资源文件 (.rc) 的其他标志或链接器选项?
提前致谢。
【问题讨论】:
你传递了DLL的HInstance
了吗? DialogBox
函数需要知道在哪里搜索。
感谢@MSalters。我已将 HInstance 作为 NULL 传递。现在我编辑我的代码并使用这个link获取hInstance。它现在可以工作了。
好吧,HInstance==NULL
的意思是“从 EXE 中获取资源”,因此当您告诉 Windows 寻找其他位置时,Windows 无法在 DLL 中找到资源也就不足为奇了。
@MSalters 你应该把这个写成答案——它可能对其他人有用。
【参考方案1】:
考虑到确认HInstance==NULL
的评论,这意味着电话真的是DialogBox(NULL, MAKEINTRESOURCE(IDD_INPUTDIALOG), NULL, NotifyUser);
。这会在进程的 EXE 文件中查找对话框。那是默认位置。要告诉 Windows 到别处寻找,您需要正确的 DLL 实例。
要从 DLL 中找出您自己的实例,请调用 GetModuleHandle
。
【讨论】:
以上是关于在 Visual Studio 2012 中,如何将资源文件 (.rc) 与 c ++ dll 链接的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2012(或 Resharper)中禁用 /* 自动完成
如何删除 Visual Studio 2012 的 Blend?
在 Visual Studio 2012 RC 中,如何调试 javascript IntelliSense 扩展?
如何在 Visual Studio 2012 中查看 SQL Server CE 系统表