如何在Microsoft Visual C++中使用dllimport

Tux*_*Tux 6 c++ linker dllimport linker-errors visual-c++

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

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

当我编译以下代码时

  • 错误LNK2019:函数_main中引用的未解析的外部符号_ imp _Initialize

  • 致命错误LNK1120:1个未解析的外部因素

我得到了上述错误

我正在使用Windows和Visual Studio 2008

Chr*_*cke 4

从你的措辞来看,很明显你正在使用 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(...
  • ?初始化@@YAHPADOH@Z" - `__declspec(dllexport) int Initialize(char*,char*,int);
  • ?初始化@@YGHPADOH@Z" - `__declspec(dllexport) int __stdcall Initialize(char*,char*,int);

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