__declspec(dllimport)如何加载库

时间:2013-07-29 22:11:42

标签: c++ dll dllexport

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

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

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

 __declspec(dllexport) void myfunc(){}

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

 __declspec(dllimport) void myfunc(void);

但我的程序如何知道在哪里找到这个功能?

3 个答案:

答案 0 :(得分:11)

这是编译器/链接器作业,只要你

就会自动完成
  1. 在链接器选项中包含.lib
  2. 在运行时提供DLL,以便exe
  3. 找到它

    编译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,则可以使用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();

答案 2 :(得分:1)

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

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