【问题标题】:__declspec(dllimport) how to load library__declspec(dllimport) 如何加载库
【发布时间】:2013-07-29 21:31:24
【问题描述】:

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

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

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

 __declspec(dllexport) void myfunc(){}

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

 __declspec(dllimport) void myfunc(void);

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

【问题讨论】:

  • 这不取决于您的程序。由操作系统来查找您需要的 DLL。你可以给它一个非常困难的时间这样做,但这样做是没有意义的。确保 DLL 与您的 EXE 位于同一目录中,并且它将正常工作。

标签: c++ dll dllexport


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是编译器/链接器的工作,只要你自动完成

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

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

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

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

    这些指令将使 Exe 找到 DLL 并在运行时加载导出的函数。 DLL 必须位于 Exe 旁边(不过,还有其他可能的位置)。

    __declspec(dllimport)__declspec(dllexport) 之间的切换由宏 provided by Visual C++ when creating a DLL project 完成。

    【讨论】:

    • 如何在运行时提供 DLL?
    【解决方案3】:

    如果您使用的是 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();
    

    【讨论】:

    • 是 __declspec(dllimpport) 的替代品吗?
    • 这比 declspec(dllimport) 有什么优势吗?我通常把它宏起来。
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2013-03-26
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多