叫功能在DLL从C++
-
22-08-2019 - |
题
我有一个解决方案中VS2008年有2个项目。一个是DLL C++编写的,其他是一个简单的C++控制台创建的应用程序从一个空白的项目。我想知道如何电话的功能在DLL从应用程序。
假设我开始有一个空白C++的项目,我想要呼叫一个函数 int IsolatedFunction(int someParam)
我怎么叫它?
解决方案
有很多方法可以做到这一点,但我认为最简单的一个选项是在链接时到应用程序链接到DLL,然后使用的定义文件的定义从导出的符号该DLL。
警告:定义文件的工作方式为最好成绩的未装饰的符号名。如果你要导出的装饰符号那么它可能是更好的的不使用的定义文件的方法。
下面是在这是如何完成的一个简单的例子。
<强>步骤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
第四步:创建DLL项目和 export.cpp 和 export.def 的文件添加到这个项目中。建设该项目将创建一个 export.dll 的和的 export.lib 的文件。
在以下两个步骤链接到DLL在链接时。如果你不想在链接时确定的入口点,忽略了接下来的两个步骤,并在运行时使用调用LoadLibrary 和 GetProcAddress的加载函数入口点。
<强>步骤5:创建测试应用项目通过添加 export.lib 文件项目使用DLL。复制 export.dll 文件部份效果相同的位置的测试控制台可执行文件。
<强>步骤6:拨打的 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精灵有一个在,让您导出函数的DLL复选框的项目。
然后,在该exe应用你只需要#包括从与适当定义的dll的报头,并添加dll项目作为一个依赖于该exe应用
如果您要调查这点进一步导出函数从该检查的其他问题与DLLEXPORT 的DLL。
你可以去LoadLibrary/GetProcAddress途径(如Harper提到在他的回答,这里的链接 运行时间的动态联MSDN样 再次)或者你可以连接你的控制台应用程序。lib生产DLL项目,并包括hea.h文件与《宣言》的功能(如在 负载时的动态联MSDN样)
在这两种情况下,需要确保DLL出口的功能你想要呼叫正确。最简单的办法就是通过使用声明影响(dllexport)在功能宣言(如图中所示的创建 简单的的动态链接MSDN library样),虽然您可以做它还通过相应。def文件在您的DLL项目。
更多信息的话题Dll,你应该浏览过的 MSDN关系图书馆 主题。
下面是5所需的步骤:
- 申报功能的指针
- 负载的图书馆
- 获得程序的地址
- 将它分配给功能的指针
- 叫功能的使用功能的指针
你可以找到逐步VC++IDE屏幕上开枪 http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.html
这里是代码段:
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动态运行时加载,你正在寻找LoadLibrary和GetProAddress。有上 MSDN 的一个例子。
当DLL是创建一个进口lib通常是自动创造的和你应该用那个链接到你的程序与标题的文件呼吁,但如果没有,那么你可以手动呼windows功能喜欢 LoadLibrary 和 GetProcAddress 得到它的工作。