http://msdn.microsoft.com/en-us/library/9h658af8.aspx
MSDN说我可以用__declspec(dllexport)从库中导出函数,但是如何在我的可执行文件中加载这个库呢?
我在DLL中有一个导出的函数:
__declspec(dllexport) void myfunc(){}现在我想在我的可执行文件中使用它:
__declspec(dllimport) void myfunc(void);但是我的程序如何知道在哪里可以找到这个函数呢?
发布于 2013-07-30 06:17:56
这是编译器/链接器作业,只要您
找到
.lib文件是在编译DLL时生成的,如果它不是您的代码,则随附该文件。在这种情况下,使用__declspec(dllexport)编译代码。
编译exe时,编译器会发现包含的函数位于DLL中。在这种情况下,使用__declspec(dllimport)编译代码。
链接器随.lib文件一起提供,并在可执行文件中生成相应的指令。
这些指令将使Exe在运行时找到DLL并加载导出的函数。DLL只需紧挨着Exe (但是,还有其他可能的位置)。
__declspec(dllimport)和__declspec(dllexport)之间的切换是由宏provided by Visual C++ when creating a DLL project完成的。
发布于 2013-07-30 06:21:20
如果使用的是动态链接库,则可以使用LoadLibrary和GetProcAddress的组合。
//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-30 06:16:18
您的操作系统将能够根据链接过程找到它。如果您的库正确链接到您的程序,它将识别出正在使用外部函数,并在dll路径中查找它。如果它找不到它,你的链接器将抛出一个错误。
我建议对链接过程进行一些阅读;它有时可能会令人困惑,但理解它可能会帮助您掌握C/C++中的一些关键概念。
https://stackoverflow.com/questions/17935113
复制相似问题