C++动态库

xiaoxiao2021-02-28  115

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

转载请注明原文地址: https://www.6miu.com/read-42547.html

最新回复(0)