我有一个在VS 2008中的解决方案,其中包含两个项目。一个是用C++编写的DLL,另一个是从空白项目创建的简单C++控制台应用程序。我想知道如何从应用程序中调用DLL中的函数。
假设我从一个空白的C++项目开始,并且我想调用一个名为int IsolatedFunction(int someParam)
的函数。
我该如何调用它呢?
我有一个在VS 2008中的解决方案,其中包含两个项目。一个是用C++编写的DLL,另一个是从空白项目创建的简单C++控制台应用程序。我想知道如何从应用程序中调用DLL中的函数。
假设我从一个空白的C++项目开始,并且我想调用一个名为int IsolatedFunction(int someParam)
的函数。
我该如何调用它呢?
有很多方法可以实现这一目的,但我认为最简单的方法之一是在链接时将应用程序链接到 DLL,然后使用 定义文件 来定义要从 DLL 导出的符号。
注意:定义文件方法最适合于 未装饰 的符号名称。如果你想导出修饰过的符号,则最好不要使用定义文件方法。
以下是一个简单的示例,说明如何完成这个过程。
第一步:在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;
}
第三步:在 export.def 定义文件中将该函数定义为一个导出项。
EXPORTS IsolatedFunction @1
第四步: 创建一个DLL项目,并将export.cpp和export.def文件添加到该项目中。构建此项目将创建一个export.dll和一个export.lib文件。
以下两个步骤在链接时连接到DLL。如果您不想在链接时定义入口点,请忽略下面的两个步骤并使用LoadLibrary和GetProcAddress在运行时加载函数入口点。
第五步: 创建一个Test应用程序项目,通过将export.lib文件添加到项目中来使用dll。将export.dll文件复制到与Test控制台可执行文件相同的位置。
第六步: 在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;
}
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的更多信息,您可以浏览MSDN 关于动态链接库主题。
可能会有用:https://www.codeproject.com/Articles/6299/Step-by-Step-Calling-C-DLLs-from-VC-and-VB-Part-4
对于上面的示例中的“GetWelcomeMessage”,如果调用导入函数后出现错误,则可能需要在函数名前的typedef字段中指定“__stdcall”。
当 DLL 被创建时,通常会自动创建一个导入库,您应该将其与头文件一起链接到程序中进行调用,但如果没有,则可以手动调用 Windows 函数,如 LoadLibrary 和 GetProcAddress 以使其正常工作。