gpt4 book ai didi

c++ - 从控制台应用程序动态使用 DLL

转载 作者:行者123 更新时间:2023-12-02 15:53:01 25 4
gpt4 key购买 nike

我正在尝试创建一个库 Lib.dll 以从控制台应用程序动态调用,但找不到我想要调用的函数 funci()

Lib.dll 是在 Visual Studio 2019 中创建的项目(控制台应用程序,但设置为配置类型:.dll)的结果。

Lib.cpp 是该项目中唯一的文件,并且仅包含代码:

__declspec(dllexport) int funci() 
{
return 50;
}

我认为我正确导出了该函数,因为我使用 DLL Export Viewer v1.66 找到了该函数.

enter image description here

但是,我很难通过控制台应用程序 (.exe) 找到该函数:

#include <windows.h>
#include <iostream>

typedef int(__cdecl* o_funci)(void);

o_funci funci;

int main()
{
HINSTANCE hGetProcIDDLL = LoadLibraryA("C:\\Lib.dll");

if (!hGetProcIDDLL) {
std::cout << "could not load the dynamic library" << std::endl;
return EXIT_FAILURE;
}

// resolve function address here
funci = (o_funci) GetProcAddress(hGetProcIDDLL, "funci");
if (!funci) {
std::cout << "could not locate the function" << std::endl;
return EXIT_FAILURE;
}

std::cout << "funci() returned " << funci() << std::endl;

FreeLibrary(hGetProcIDDLL);
}

GetProcAddress 出现问题,但不知道原因。我哪里出错了?

输出:

enter image description here

我一直在看这个旧帖子:Dynamically load a function from a DLL


编辑:感谢 tenfour 解决了

我使用了 DependencyWalker。

没有 extern "C" 我可以看到未修饰的 funci 的名称为 ?funci@@YGHXZ,

enter image description here

所以funci = (o_funci)GetProcAddress(hGetProcIDDLL, "?funci@@YGHXZ"); 工作了。

使用 extern "C" 时,未修饰的 funci 的名称为 _funci@0 - 更干净一点。

enter image description here

另一条注释;使用序数 0x0001 在这两种情况下都有效。像这样:funci = (o_funci)GetProcAddress(hGetProcIDDLL, (PCSTR)0x0001);

enter image description here

最佳答案

您正在使用的工具正在向您显示导出名称的漂亮版本。它的真实名称将包括名称修改,这是一种将调用信息嵌入到导出名称中的复杂尝试。

您有多种选择可以使用 GetProcAddress 实现此目的:

  1. 使用真实的导出名称。您的工具可能可以选择查看未美化的名称(损坏的导出名称)
  2. 使用模块定义文件 (*.def) 导出函数,您甚至可以在其中指定导出的名称
  3. 按序号而不是名称导入
  4. 将函数包装在 extern "C"{ ... } 中,这将使用 C 风格命名,从而避免名称修改。

最常见的解决方案可能是#4,其次是#2。

关于c++ - 从控制台应用程序动态使用 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61382829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com