__declspec(dllimport)如何加载库

dee*_*ace 12 c++ dll dllexport

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

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

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

 __declspec(dllexport) void myfunc(){}
Run Code Online (Sandbox Code Playgroud)

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

 __declspec(dllimport) void myfunc(void);
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*esB 12

这是编译器/链接器作业,只要您自动完成

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

编译DLL时会生成.lib文件,如果它不是您的代码,则会随附它.在这种情况下,代码是使用编译的__declspec(dllexport).

编译exe时,编译器会看到在DLL中找到包含的函数.在这种情况下,代码是使用编译的__declspec(dllimpport).

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

这些指令将使Exe找到DLL并在运行时加载导出的函数.DLL必须紧挨着Exe(但是还有其他可能的地方).

之间的切换__declspec(dllimpport)__declspec(dllexport)由宏完成,创建一个DLL项目时由Visual C++提供的.


Kir*_*kus 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();
Run Code Online (Sandbox Code Playgroud)

  • 是__declspec(dllimpport)的替代品吗? (4认同)
  • 是的,它是`__declspec(dllimport)`的替代品吗? (2认同)