12

http://msdn.microsoft.com/en-us/library/9h658af8.aspx

MSDN 说我可以从库中导出函数,__declspec(dllexport)但是如何将这个库加载到我的可执行文件中?

我在 DLL 中有一个导出函数:

 __declspec(dllexport) void myfunc(){}

现在我想在我的可执行文件中使用它:

 __declspec(dllimport) void myfunc(void);

但是我的程序如何知道在哪里可以找到这个函数呢?

4

3 回答 3

12

这是编译器/链接器的工作,只要你自动完成

  1. 在链接器选项中包含 .lib
  2. 在运行时提供 DLL,以便 exe 找到它

.lib 文件是在您编译 DLL 时生成的,或者如果它不是您的代码,则随它一起提供。在这种情况下,代码使用__declspec(dllexport).

编译您的 exe 时,编译器会看到包含的函数位于 DLL 中。在这种情况下,代码使用__declspec(dllimport).

链接器随 .lib 文件一起提供,并在 exe 中生成适当的指令。

这些指令将使 Exe 找到 DLL 并在运行时加载导出的函数。DLL 必须在 Exe 旁边(但是还有其他可能的位置)。

__declspec(dllimport)和之间的切换由 Visual C++ 在创建 DLL 项目时提供__declspec(dllexport)的宏完成。

于 2013-07-29T22:17:56.240 回答
6

如果您使用的是 DLL,则可以使用LoadLibraryandGetProcAddress组合。

//Load the DLL
HMODULE lib = LoadLibrary("testing.dll");

//Create the function
typedef void (*FNPTR)();
FNPTR myfunc = (FNPTR)GetProcAddress(lib, "myfunc");

//EDIT: For additional safety, check to see if it loaded
if (!myfunc) {
    //ERROR.  Handle it.
}

//Call it!
myfunc();
于 2013-07-29T22:21:20.020 回答
1

您的操作系统将能够根据链接过程找到它。如果您的库正确链接到您的程序,它将识别出正在使用的外部函数,并在 dll 路径中查找它。如果它找不到它,你的链接器会抛出一个错误。

我建议对链接过程进行一些阅读;有时可能会令人困惑,但理解它可能会帮助您掌握 C/C++ 中的一些关键概念。

于 2013-07-29T22:16:18.273 回答