__declspec(dllimport)如何加载库

13

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

MSDN指出,我可以使用__declspec(dllexport)从库中导出函数,但是我该如何在可执行文件中加载此库呢?

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

 __declspec(dllexport) void myfunc(){}

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

 __declspec(dllimport) void myfunc(void);

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


4
请查看:https://dev59.com/G3RB5IYBdhLWcg3wuZU1,该链接介绍了如何使用 dllexport 从 DLL 中导出函数。 - Kirk Backus
3
这不取决于您的程序。操作系统负责查找所需的DLL文件。您可以让它很难找到,但这样做没有意义。请确保DLL文件与您的可执行文件在同一个目录中,那么它就可以完美运行。 - Hans Passant
3个回答

13
这是编译器/链接器的工作,只要你:
  1. 在链接器选项中包含了 .lib 文件
  2. 在运行时提供了 DLL,以便 exe 可以找到它
就可以自动完成。.lib 文件在编译 DLL 时生成,或者如果不是你的代码,则随其一起提供。在这种情况下,代码使用 __declspec(dllexport) 进行编译。
当编译你的 exe 时,编译器会看到所包含的函数应该在 DLL 中找到。在这种情况下,代码使用 __declspec(dllimport) 进行编译。
链接器提供了 .lib 文件,并在 exe 中生成适当的指令。这些指令将使 Exe 在运行时找到 DLL 并加载导出的函数。DLL 只需与 Exe 相邻(但也有其他可能的位置)。
在创建 DLL 项目时,通过 Visual C++ 提供的宏 来切换 __declspec(dllimport) 和 __declspec(dllexport)

我如何在运行时提供DLL? - deepspace

6
如果您正在使用DLL,可以使用LoadLibraryGetProcAddress组合。
//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();

4
那是__declspec(dllimport)的一种替代方式吗? - pasha
这种方法与declspec(dllimport)相比有什么优势吗?我通常会使用宏。 - Jamie Nicholl-Shelley

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接