从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.cpp和export.def文件添加到此项目。 构build这个项目将创build一个export.dll和一个export.lib文件。
以下两个步骤在链接时链接到DLL。 如果您不想在链接时定义入口点,请忽略接下来的两个步骤,并使用LoadLibrary和GetProcAddress在运行时加载函数入口点。
第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个步骤:
- 声明函数指针
- 加载库
- 获取程序地址
- 将其分配给函数指针
- 使用函数指针调用函数
你可以在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)来使其工作。