从C++调用DLL中的函数

Que*_*mer 39 c++ dll dllimport visual-studio-2008

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

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

我怎么称呼它?

jus*_*sij 20

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

CAVEAT:定义文件方法适用于未修饰的符号名称.如果要导出装饰符号,则最好不要使用定义文件方法.

这是一个如何完成的简单示例.

第1步:export.h文件中定义函数.

int WINAPI IsolatedFunction(const char *title, const char *test);
Run Code Online (Sandbox Code Playgroud)

第2步:export.cpp文件中定义函数.

#include <windows.h>

int WINAPI IsolatedFunction(const char *title, const char *test)
{
    MessageBox(0, title, test, MB_OK);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

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

EXPORTS    IsolatedFunction          @1
Run Code Online (Sandbox Code Playgroud)

步骤4:创建DLL项目并将export.cppexport.def文件添加到此项目.构建此项目将创建一个export.dll和一个export.lib文件.

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

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

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,你是对的,我创建了Win32控制台应用程序,为什么我的没有,你创建了Win32项目,所以你在stdafx.h中.只知道区别.谢谢 (2认同)

Ism*_*ael 9

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

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

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

如果您想进一步研究这一点,请检查另一个问题.使用dllexport从DLL导出函数.


Fra*_*nov 6

你可以去LoadLibrary/GetProcAddress路由(正如Harper在他的回答中提到的,这里是运行时动态链接MSDN样本的链接)或者你可以将你的控制台应用程序链接到从DLL项目生成的.lib并包含hea带有函数声明的.h文件(如加载时动态链接MSDN示例中所述)

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

有关DLL主题的更多信息,您应该浏览MSDN关于动态链接库主题.


小智 5

以下是所需的5个步骤:

  1. 声明函数指针
  2. 加载库
  3. 获取程序地址
  4. 分配给函数指针
  5. 使用函数指针调用函数

您可以在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;
}
Run Code Online (Sandbox Code Playgroud)