从C ++调用DLL中的函数

时间:2009-02-11 23:34:12

标签: c++ visual-studio-2008 dll dllimport

我在VS 2008中有一个解决方案,里面有2个项目。一个是用C ++编写的DLL,另一个是从空白项目创建的简单C ++控制台应用程序。我想知道如何从应用程序中调用DLL中的函数。

假设我从一个空白的C ++项目开始,并且我想调用一个名为int IsolatedFunction(int someParam)的函数

我该怎么称呼它?

7 个答案:

答案 0 :(得分:20)

有很多方法可以做到这一点,但我认为最简单的选择之一是在链接时将应用程序链接到DLL,然后使用定义文件来定义要从中导出的符号DLL。

CAVEAT:定义文件方法适用于未修饰的符号名称。如果要导出装饰符号,那么 NOT USE 定义文件方法可能更好。

以下是一个关于如何完成此操作的简单示例。

第1步: export.h 文件中定义该功能。

int WINAPI IsolatedFunction(const char *title, const char *test);

第2步: export.cpp 文件中定义该功能。

#include <windows.h>

int WINAPI IsolatedFunction(const char *title, const char *test)
{
    MessageBox(0, title, test, MB_OK);
    return 1;
}

第3步: export.def 定义文件中将该函数定义为导出。

EXPORTS    IsolatedFunction          @1

步骤4:创建DLL项目并将 export.cpp export.def 文件添加到此项目中。构建此项目将创建 export.dll export.lib 文件。

以下两个步骤在链接时链接到DLL。如果您不想在链接时定义入口点,请忽略接下来的两个步骤,并使用 LoadLibrary GetProcAddress 在运行时加载函数入口点。 / p>

步骤5 :通过将 export.lib 文件添加到项目中,创建 Test 应用程序项目以使用dll。将 export.dll 文件复制到与 Test 控制台可执行文件相同的位置。

第6步:在Test应用程序中调用 IsolatedFunction 函数,如下所示。

#include "stdafx.h"

// get the function prototype of the imported function
#include "../export/export.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // call the imported function found in the dll
    int result = IsolatedFunction("hello", "world");

    return 0;
}

答案 1 :(得分:9)

也可以从dll导出函数并从exe导入,起初它比较棘手,但最后比调用LoadLibrary / GetProcAddress容易得多。见MSDN

使用VS向导创建项目时,dll中有一个允许导出函数的复选框。

然后,在exe应用程序中,您只需要使用正确的定义#include dll中的头文件,并将dll项目作为依赖项添加到exe应用程序中。

如果您想进一步调查此问题,请查看此其他问题Exporting functions from a DLL with dllexport

答案 2 :(得分:6)

您可以使用LoadLibrary / GetProcAddress路由(正如Harper在他的回答中提到的,这里是再次链接到run-time dynamic linking MSDN sample ),或者您可以将控制台应用程序链接到DLL项目生成的.lib并包含带有函数声明的hea.h文件(如load-time dynamic linking MSDN sample中所述)

在这两种情况下,您都需要确保您的DLL导出要正确调用的函数。最简单的方法是在函数声明上使用__declspec(dllexport)(如创建simple dynamic-link library MSDN sample所示),尽管你也可以通过DLL项目中相应的.def文件来完成。

有关DLL主题的更多信息,您应浏览MSDN About Dynamic-Link Libraries主题。

答案 3 :(得分:5)

以下是所需的5个步骤:

  1. 声明函数指针
  2. 加载库
  3. 获取程序地址
  4. 将其指定给函数指针
  5. 使用函数指针
  6. 调用该函数

    您可以在http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.html

    处找到VC ++ IDE屏幕截图

    以下是代码段:

    int main()
    {
    /***
    __declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding
     ***/
        typedef bool (*GW)(char *buf, int len);
    
        HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL"));
        GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage");
    
        char buf[128];
        if(GetWelcomeMessage(buf, 128) == true)
            std::cout << buf;
            return 0;
    }
    

答案 4 :(得分:1)

可能有用:https://www.codeproject.com/Articles/6299/Step-by-Step-Calling-C-DLLs-from-VC-and-VB-Part-4

对于上面带有“ GetWelcomeMessage”的示例,如果在调用导入的函数后出错,则可能需要在函数名称前的typedef字段中指定“ __stdcall”。

答案 5 :(得分:0)

假设您正在讨论DLL的动态运行时加载,那么您正在寻找LoadLibrary和GetProAddress。 MSDN上有一个例子。

答案 6 :(得分:0)

创建DLL时,通常会自动创建导入库,您应该使用链接到程序中的头文件和头文件来调用它,但如果没有,则可以手动调用LoadLibrary和{等窗口函数{3}}让它运转起来。