C++动态库

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值