Que*_*mer 39 c++ dll dllimport visual-studio-2008
我在VS 2008中有一个解决方案,里面有2个项目.一个是用C++编写的DLL,另一个是从空白项目创建的简单C++控制台应用程序.我想知道如何从应用程序调用DLL中的函数.
假设我从一个空白的C++项目开始,我想调用一个名为的函数 int IsolatedFunction(int someParam)
我怎么称呼它?
jus*_*sij 20
有很多方法可以做到这一点,但我认为最简单的选择之一是在链接时将应用程序链接到DLL,然后使用定义文件来定义要从DLL导出的符号.
CAVEAT:定义文件方法适用于未修饰的符号名称.如果要导出装饰符号,则最好不要使用定义文件方法.
这是一个如何完成的简单示例.
第1步:在export.h文件中定义函数.
int WINAPI IsolatedFunction(const char *title, const char *test);
Run Code Online (Sandbox Code Playgroud)
第2步:在export.cpp文件中定义函数.
#include <windows.h>
int WINAPI IsolatedFunction(const char *title, const char *test)
{
MessageBox(0, title, test, MB_OK);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
步骤3:在export.def定义文件中将函数定义为导出.
EXPORTS IsolatedFunction @1
Run Code Online (Sandbox Code Playgroud)
步骤4:创建DLL项目并将export.cpp和export.def文件添加到此项目.构建此项目将创建一个export.dll和一个export.lib文件.
以下两个步骤在链接时链接到DLL.如果您不想在链接时定义入口点,请忽略接下来的两个步骤,并使用LoadLibrary和GetProcAddress在运行时加载函数入口点.
步骤5:通过将export.lib文件添加到项目中来创建测试应用程序项目以使用dll .将export.dll文件复制到与测试控制台可执行文件相同的位置.
第6步:调用IsolatedFunction从Test应用程序中函数,如下所示.
#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;
}
Run Code Online (Sandbox Code Playgroud)
也可以从dll导出函数并从exe导入,起初它比较棘手,但最后比调用LoadLibrary/GetProcAddress容易得多.请参阅MSDN.
使用VS向导创建项目时,在dll中有一个允许导出函数的复选框.
然后,在exe应用程序中,您只需要使用正确的定义#include dll中的头,并将dll项目作为依赖项添加到exe应用程序中.
如果您想进一步研究这一点,请检查另一个问题.使用dllexport从DLL导出函数.
你可以去LoadLibrary/GetProcAddress路由(正如Harper在他的回答中提到的,这里是运行时动态链接MSDN样本的链接)或者你可以将你的控制台应用程序链接到从DLL项目生成的.lib并包含hea带有函数声明的.h文件(如加载时动态链接MSDN示例中所述)
在这两种情况下,您都需要确保DLL导出要正确调用的函数.最简单的方法是在函数声明上使用__declspec(dllexport)(如创建一个简单的动态链接库MSDN示例所示),尽管你也可以通过DLL项目中相应的.def文件来完成.
有关DLL主题的更多信息,您应该浏览MSDN关于动态链接库主题.
小智 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;
}
Run Code Online (Sandbox Code Playgroud)