我在VS 2008中有一个解决方案,里面有2个项目。一个是用C ++编写的DLL,另一个是从空白项目创建的简单C ++控制台应用程序。我想知道如何从应用程序中调用DLL中的函数。
假设我从一个空白的C ++项目开始,并且我想调用一个名为int IsolatedFunction(int someParam)
的函数
我该怎么称呼它?
答案 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个步骤:
您可以在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}}让它运转起来。