在 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 系统表

如何在 C++ 中使用 Microsoft Visual Studio 2012 查找语法错误?

如何使用 Visual Studio 2012 构建 cppunit