从C ++调用DLL中的函数

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

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

我怎样称呼它?

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

CAVEAT:定义文件方法最适合未修饰的符号名称。 如果你想导出装饰的符号,那么最好不要使用定义文件的方法。

这是一个简单的例子,如何做到这一点。

第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步:创build一个DLL项目,并将export.cppexport.def文件添加到此项目。 构build这个项目将创build一个export.dll和一个export.lib文件。

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

第5步:通过将export.lib文件添加到项目中,创build一个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; } 

也可以从DLL导出函数和从EXE导入,它首先是比较棘手,但最终比调用LoadLibrary / GetProcAddress更容易。 请参阅MSDN 。

当使用VS向导创build项目时,在dll中有一个checkbox,可以导出函数。

然后,在EXE应用程序中,您只需要#从DLL中包含正确的定义头,并将DLL项目作为依赖项添加到EXE应用程序。

如果你想进一步研究这个问题,请检查这个其他问题。 用dllexport从DLL中导出函数 。

你可以去LoadLibrary / GetProcAddress路由(就像Harper在他的回答中提到的,这里是链接到运行时dynamic链接MSDN示例再次),或者你可以把你的控制台应用程序链接到DLL项目生成的.lib,并包括hea .h文件与您的函数声明(如加载时dynamic链接MSDN示例中所述 )

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

有关DLL的主题的更多信息,您应浏览MSDN关于dynamic链接库主题。

以下是所需的5个步骤:

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

你可以在http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.htmlfind一步一步的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; } 

假设你正在讨论DLL的dynamic运行时加载,你正在寻找LoadLibrary和GetProAddress。 在MSDN上有一个例子。

当创buildDLL时,通常会自动创build一个导入库,并且应该使用链接到头文件中的头文件来调用它,但是如果没有,则可以手动调用Windows函数(如LoadLibrary和GetProcAddress)来使其工作。