一.VS2015创建新的解决方案MyDll,选空项目。完成后,添加MyDll.h和MyDll.cpp两个文件
MyDll.h中代码:
#pragma once
#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
MYLIBAPI int g_nResult;
MYLIBAPI int Add(int a, int b);
修饰符 extern "C" 包含双重含义:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。
__declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。
extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。
MyDll.cpp中代码:
#include <Windows.h>
#define MYLIBAPI extern "C" __declspec(dllexport)
#include "MyDll.h"
int g_nResult;
int Add(int a, int b)
{
g_nResult = a + b;
return g_nResult;
}
按Ctrl + Shift + B生成解放方案
二.使用Dll
(1)隐私链接
解决方案MyDll添加一个控制台运用程序项目CallTest,选空项目,完成后,添加CallTest.cpp文件,在CallTest.cpp文件同一个目录拷贝MyDll.h,MyDll.dll,MyDll.lib三个文件。然后选择菜单栏的“项目”->CallDll属性->链接器->输入->附近依赖项添加Mydll.dll;设置CallTest为启动项目.如图:
CallTest.cpp添加代码:
#include <iostream>
#include <Windows.h>
#include "MyDll.h"
using namespace std;
int main()
{
cout << Add(1, 2) << endl;
system("pause");
return 0;
}
(2)显示调用
新建新的Win32控制台运用程序,选空项目,添加MyDll2.cpp文件,拷贝Mydll.dll放在MyDll2.cpp目录中。添加代码:
#include <iostream>
#include <stdio.h>
#include <string>
#include <Windows.h>
using namespace std;
typedef int(*DLLFUNC) (int, int);
int main()
{
DLLFUNC dllfunc;
bool fRunTimeLinkSuccess = false;
HINSTANCE hInstLib = LoadLibrary(TEXT("MyDll.dll"));
if (NULL != hInstLib)
{
dllfunc = (DLLFUNC)GetProcAddress(hInstLib, "Add");
if (NULL != dllfunc)
{
fRunTimeLinkSuccess = true;
cout << dllfunc(1, 2) << endl;
}
FreeLibrary(hInstLib);
}
if (!fRunTimeLinkSuccess)
{
cout << "Message printed from executable" << endl;
}
system("pause");
return 0;
}