【问题标题】:C++ dll in subfolder子文件夹中的 C++ dll
【发布时间】:2020-04-22 11:49:07
【问题描述】:

我正在尝试编写一个 ActiveX 插件,但在尝试从子文件夹加载 DLL 时发现自己陷入了死胡同。我正在为 Windows 10 开发 Visual Studio 2013。

库的结构如下:

myocx.ocx --> this is the compiled result
mylibs/
  mainlib.lib
  maindll.dll
  rest-of-dlls.dll

我不直接在我的代码中加载 DLL,而是由“mainlib.lib”库使用它们。我试图在 VS Linker 的“附加依赖项”中设置 mainlib.lib 文件的路径,但它无法注册我的插件。如果我将“maindll.dll”指定为延迟加载 DLL,则它会编译,但插件不起作用(它在 delayhlp.cpp 中的某个时间点失败)。

我已阅读以下帖子:

以及来自 Microsoft 的以下文档:

我尝试将库的路径添加到我系统的 PATH 环境变量中,但由于某种原因,它在某些 PC 上不起作用。

我也尝试过清单方式(如第一个链接问题中所述),但看起来 VS 完全忽略了它,因为我可以在那里写任何东西,无论如何它都会失败。

如果我将 DLL 与插件放在同一个文件夹中,它会起作用,但由于兼容性问题,我确实需要将它们放在子文件夹中,因此该选项被丢弃。

我不介意使用动态加载,但我不知道这是否可行,因为 DLL 不是加载到我的代码中,而是加载到 .lib 文件中。我也不介意修改 PATH 变量,但正如我所说,在某些 Windows 安装中它会失败。

除了链接的帖子说什么之外,任何人都可以对此有所了解吗?

【问题讨论】:

    标签: c++ visual-studio dll


    【解决方案1】:

    在拉了很多头发之后,我设法使用上述链接的组合来解决它。

    在 Visual Studio 中,我在“链接器”部分添加了库的路径,并将 mainlib.lib 添加到依赖项中。然后,我将 maindll.dll 添加到延迟加载的 DLL 中,并在代码(主类,在导入之后)中添加了以下内容:

    #pragma comment(lib, "mainlib.lib")
    

    然后在类初始化器中,我添加了以下内容:

    SetDllDirectory("absolute_path_to_my_DLLs_folder")
    

    然后.ocx插件就可以使用regsvr32编译注册了,在执行的时候也没有失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多