gpt4 book ai didi

c++ - 如何在 Microsoft Visual C++ 中导入 dllimport

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:52 32 4
gpt4 key购买 nike

我有一个 DLL,我想使用它的一些功能。

#include <iostream>

using namespace std;

extern "C" __declspec(dllimport) int Initialize(char* localPort, char* adminServerName, int rpcTimeout);


int main()
{
int res = Initialize("7864", "6000@kabc", 10000);

return 0;
}

我没有 DLL 的 .lib 文件,所以无论如何我都可以链接到它。我想到的一件事是使用 LoadLibrary 函数,然后使用 GetProcAddress()。还有其他办法吗?

当我编译下面的代码时

  • 错误 LNK2019:未解析的外部符号 _imp_Initialize 在函数 _main 中引用

  • fatal error LNK1120:1 个 Unresolved external 问题

我得到了上面的错误

我正在使用 Windows 和 Visual Studio 2008

最佳答案

从您的措辞来看,很明显您正在使用 Dev Studio 的某个或其他版本。

为了隐式链接 dll,VC++ 需要 一个 .lib 文件,毫无疑问。如果没有 .lib,您只能使用 LoadLibrary 和 GetProcAddress 显式加载 dll。

幸运的是,导入库只包含 dll 的导出符号,因此完全合法的做法是在 VC++ 中简单地创建一个导出相同符号的 dll 项目,构建它,然后使用生成的 .lib 文件访问目标 dll .

真正的诀窍在于,让符号正确:根据原始 dll 的创建方式,可能需要处理一些修饰。

当使用 dependencywalker 查看时,“初始化”可以通过多种方式从 dll 中导出。

  • “Initialize”- 通过 .DEF 文件导出,或通过 extern "C"__declspec(dllexport) int __cdecl Initialize(...
  • "_Initalize@16"- 使用以下方式导出:extern "C"__declspec(dllexport) int __stdcall Initialize(...
  • ?Initialize@@YAHPADOH@Z"- `__declspec(dllexport) int Initialize(char*,char*,int);
  • ?Initialize@@YGHPADOH@Z"- `__declspec(dllexport) int __stdcall Initialize(char*,char*,int);

问题实际上是第一种情况 - 如果调用约定不是 __cdecl(并且大多数 dll api 实际上是 __stdcall - 所有 Windows dll 都是 __stdcall),那么你必须使用 .def 文件来导出未修饰的名称。

关于c++ - 如何在 Microsoft Visual C++ 中导入 dllimport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4041149/

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