首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__declspec(dllimport)如何加载库

__declspec(dllimport)如何加载库
EN

Stack Overflow用户
提问于 2013-07-30 06:11:42
回答 3查看 25.1K关注 0票数 12

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

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

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

代码语言:javascript
复制
 __declspec(dllexport) void myfunc(){}

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

代码语言:javascript
复制
 __declspec(dllimport) void myfunc(void);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-30 06:17:56

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

  1. 在运行时将.lib包含在链接器中,以便由exe

找到

.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完成的。

票数 12
EN

Stack Overflow用户

发布于 2013-07-30 06:21:20

如果使用的是动态链接库,则可以使用LoadLibraryGetProcAddress的组合。

代码语言:javascript
复制
//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();
票数 6
EN

Stack Overflow用户

发布于 2013-07-30 06:16:18

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17935113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档