【问题标题】:Resolving functions at runtime, not at compilation C++在运行时解析函数,而不是在编译 C++
【发布时间】:2020-10-19 18:18:34
【问题描述】:

我正在使用 Visual Studio (2017) 用 C++ 编写代码,并尝试使用来自第 3 方库的函数。

有人告诉我“[库] 不提供链接器库,因此您需要在运行时解析函数,而不是在编译时解析”。

这如何在 Visual Studio 中完成?

谢谢

编辑:显然我尝试了谷歌搜索,但提出的只是修复编译和运行时错误的建议

【问题讨论】:

标签: c++ visual-studio compilation visual-studio-2017


【解决方案1】:

如果你只需要几个函数

HMODULE hMod = LoadLibrary("C:\\lib\\path\\library.dll");
void* fnPtr = GetProcAddress(hMod, "nameOfExportedFunction");

要调用函数,您需要知道调用约定和参数,下面是一个示例:

typedef void* (__cdecl* _Cvar_Get)(const char* var_name, const char* var_value, int flags);
_Cvar_Get Cvar_Get = (_Cvar_Get)GetProcAddress(hMod, "nameOfExportedFunction");
void* result = Cvar_Get("cl_gamepath", "Name", 0);

如果 DLL 与您的 exe 位于同一目录中,那么您可以使用“library.dll”

如果您需要所有功能,请使用 dxiv 在 cmets 中发布的this 答案

【讨论】:

  • 那你怎么调用函数呢?
  • 或者创建库中定义的类型的对象?
  • @JessicaChambers 你需要知道函数的调用约定和参数类型,你可以将该函数指针转换为该函数类型,然后通过这样的地址调用它,我会更新我的答案
  • tldr;我找到了你的网站和这个帖子:guidedhacking.com/threads/how-to-call-a-game-function.7825 似乎不管我把什么写成“_Cvar_Get” VS 都告诉我它没有定义(它也不认为__cdecl * 是一个有效的标识符)
  • @JessicaChambers 这只是一个例子,我为你更新了答案。返回值是一个我没有给你的结构,例如我只是将其更改为 void* 返回值。 __cdecl 应该没有任何问题。请记住,您需要自己提供返回类型、参数和调用约定,您不能只粘贴我的答案
猜你喜欢
  • 2022-11-28
  • 2021-11-08
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多