【问题标题】:Trouble loading DLL in C/C++在 C/C++ 中加载 DLL 时遇到问题
【发布时间】:2016-05-09 17:59:24
【问题描述】:

我在为一个类项目编写代码的 Windows 控制台应用程序中加载 DLL 时遇到了一些麻烦。我不知道为什么它不加载库文件。

在我调用有错误的 LoadLibrary 之前,我在 main 之前定义了这个:

#include "lomo2.h"

HINSTANCE cargaDLL;

我也试过把 HINSTANCE 改成 HMODULE 类型,但是没用。

在 main 之后,我尝试导入位于 main: 中的 DLL:

cargaDLL =  LoadLibrary("C:\\lomo2.dll");
if (cargaDLL == NULL){
    PERROR ("Error en la carga de la libreria\n");
    Sleep(2000);
    exit (1);
}

当我调用 LoadLibrary 时,我也尝试使用像“LoadLibrary(.\my dll directory\lomo2.dll)”这样的相对路径,但它根本不起作用。

结果是显示链接库时出错的消息,在 PERROR 中。

GetLastError()检查错误,它说找不到指定的模块。

希望你能帮我解决这个问题。 谢谢。

【问题讨论】:

  • 调用 LoadLibrary 并指定相对路径时,请记住,在 Visual Studio 中,工作目录默认为项目目录。我猜你希望它是目标目录 (${TargetDir})。
  • 是时候检查GetLastError()了。 Windows 会告诉你问题所在。
  • 开启加载器快照。 lomo2.dll 可能依赖于另一个 DLL,而另一个 DLL 缺失。
  • 试试这个工具 dependencywalker.com 看看到底缺少什么
  • 要启用加载程序快照,请打开“开始”菜单并键入 gflags。如果您同时提供 x86 和 x64,请选择适当的位数。 显示加载程序快照选项位于系统注册表选项卡上。 @Exceptionon:Dependency Walker 几乎已经死了。它已经多年没有更新了,而且失败的次数多于帮助的次数。周围有更好的工具(例如 DUMPBIN)。

标签: c++ c windows dll loadlibrary


【解决方案1】:

我会使用Process Monitor 之类的东西,它会告诉你程序在尝试加载 DLL 时正在做什么。

我遇到过类似的情况,我遇到的情况是 Windows 在本地位置找不到 DLL,因此它开始查看 众所周知 位置。其中之一是搜索 PATH,在我的实例中,PATH 包含一个无法访问的位置,这导致搜索停止并且 DLL 无法加载。

【讨论】:

    【解决方案2】:

    使用以下代码:

    HMODULE cargaDLL;
    cargaDLL =  LoadLibrary(L"C:\\lomo2.dll");
    

    始终使用 UNICODE 作为项目类型。 出于其他原因,使用相对路径更好(使用“c:\lomo.dll”可以)。 如果您与其他程序员在一个项目上合作,最好假设所有文件都将放在一个文件夹中,并使用该文件夹的相对路径。

    【讨论】:

      【解决方案3】:

      通过在 Visual Studio 项目设置中将字符集从“Unicode”更改为“No Set”解决了问题。

      感谢大家的回答。

      【讨论】:

      • 如果您将 Character Set 设置为 Unicode,您的问题中的代码甚至无法编译。因此,要么您在问题中撒谎,要么这不是答案。此外,为新项目选择最糟糕的字符编码从来都不是解决方案。
      • 我没有撒谎。Visual Studio 的配置是默认的,所以我没有将字符集设置为 Unicode,它是默认设置的。这就是它无法编译的原因。所以我的问题的答案就是我所说的(我的老师告诉我这可能是导致该问题的原因)或将函数 LoadLibrary 更改为 LoadLibraryW。
      • 如果您保留默认设置 (Unicode),则 LoadLibrary("C:\\lomo2.dll"); 将无法编译。由于您在谈论链接器错误,它确实编译,所以您没有说实话。您要么没有使用 Unicode 字符编码,要么没有链接器错误(而是编译器错误)。无论如何,包含“it doesn't work at”这句话的问题需要改进。
      • 所有 Visual Studio 新项目必须是 UNICODE
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多