一.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; }
