http://msdn.microsoft.com/en-us/library/9h658af8.aspx
MSDN说我可以使用__declspec(dllexport)
从库中导出函数,但是如何在我的可执行文件中加载这个库?
我在DLL中有一个导出的函数:
__declspec(dllexport) void myfunc(){}
现在我想在我的可执行文件中使用它:
__declspec(dllimport) void myfunc(void);
但我的程序如何知道在哪里找到这个功能?
答案 0 :(得分:11)
这是编译器/链接器作业,只要你
就会自动完成编译DLL时会生成.lib文件,如果它不是您的代码,则会随附它.lib文件。在这种情况下,代码使用__declspec(dllexport)
进行编译。
编译exe时,编译器会看到在DLL中找到包含的函数。在这种情况下,代码使用__declspec(dllimpport)
进行编译。
链接器提供.lib文件,并在exe。
中生成适当的指令这些指令将使Exe找到DLL并在运行时加载导出的函数。 DLL必须紧挨着Exe(但是还有其他可能的地方)。
在__declspec(dllimpport)
和__declspec(dllexport)
之间切换是由宏provided by Visual C++ when creating a DLL project完成的。
答案 1 :(得分:5)
如果您使用的是DLL,则可以使用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();
答案 2 :(得分:1)
您的操作系统将能够根据链接过程找到它。如果您的库已正确链接到您的程序,它将识别出正在使用外部函数,并在dll路径中查找它。如果找不到它,链接器将抛出错误。
我建议读一下链接过程;它有时会令人困惑,但理解它可能会帮助你掌握C / C ++中的一些关键概念。