在VS2015中创建C++动态链接dll,和两种调用动态链接dll的两种方式

一、创建动态链接库DLL项目

1 文件->项目->Visual C++->Win32->Win32 控制台应用程序

创建名为MyDll的项目,如下图所:

2 在应用程序设置中设置应用程序类型为DLL,如下图所示:

3.在头文件中添加MyDll.h文件

代码:

#pragma once
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif

namespace DLL {
	class Myth {
	public:
		static MATHFUNCSDLL_API double add(double a, double b);
	};
}

4.在MyDll.cpp文件中给函数定义:

代码:

#include "stdafx.h"
#include<iostream>
#include "MyDll.h"

namespace DLL {
	double Myth::add(double a, double b) {
		return a + b;
	}
}

5.点击生成->生成解决方案,会生成MyDll.dll和MyDll.lib文件

 二、调用动态库DLL

2.1 在DLL工程中新建解决方案

1)在DLL所在的工程 文件->新建->项目->Visual C++->Win32 控制台应用程序

2)在解决方案处点击添加到解决方案

3)将新建的解决方案设置为启动项目

4)右键项目(我的是test1)下的引用->添加引用->将MyDll 打勾

5)项目(我的是test1)->属性

6)点击c/c++,将MyDll.h所在的目录路径添加到附加包含目录

7)测试程序,将添加头文件MyDll.h

#include "stdafx.h"
#include<iostream>
#include"MyDll.h"

int main()
{
	std::cout << DLL::Myth::add(1, 2) << std::endl;
	system("pause");
    return 0;
}

8)执行程序

2.2 类似于调用第三方库那样调用dll文件

1)为了方便现将刚才创建的MyDll.dll,MyDll.lib,MyDll.h文件放到一个文件中,放在lib1中,MyDll.dll在debug中,debug和release的dll和lib不能混用,一定要注意区分,MyDll.lib存放在lib中,MyDll.h存放在include中

2)新建win32控制应用程序工程test1

3)test1->属性 到达属性页->调试,将MyDll.dll所在的目录路径添加到 环境 中

4)将MyDll.lib的目录路径添加到VC++目录中的库目录中

5)将MyDll.h所在目录的路径添加到C/C++中的附加包含目录中

6)链接器->输入->附加依赖项 添加MyDll.lib

 7)将MyDll.h添加到测试程序中

注意:debug生成的dll lib只能用在debug中   release生成的dll lib只能用在release中

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用VS2015编译和调用动态链接库dll 1. 首先建工程,选择dll,记得勾上“导出符号” 后面不用自己搞那些宏定义会省事很多。 建立工程myDll,记得勾上“导出符号” 类型选择dll 2. IDE自动生成的代码已经把整个架构弄好了,其和项目同名的.h和.cpp文件就是我们自己写代码的地方了。我想写的dll是导出一个类,在这里我就直接在它自动生成的CmyDll类上面改了。 myDll.h myDll.cpp 在mydll.h和mydll.cpp给类添加成员函数 //mydll.h class MYDLL_API CmyDll { public: CmyDll(void); // TODO: 在此添加您的方法。 int myFunction(int a, int b); }; //mydll.cpp int CmyDll::myFunction(int a, int b) { return a*b; } 3.编译的时候我选择了release,这里可以用默认的debug也行 在mydll.h和mydll.cpp给类添加成员函数 最后生成解决方案后产生的mydll.lib和mydll.dll就是我们需要的二进制文件了。lib文件是编译是要用的,而dll调用这个库的程序运行时需要的。 调用dll 1.重新建立一个工程 这回选择普通的控制台程序就行了。我建了个名为myDllCall的工程。 2.把库的头文件include进来,以及连接lib文件 其 include进来的 myDll.h 和 **#pragma comment()**的lib根据自己的路径写。 #include "stdafx.h" #include "../../myDll/myDll/myDll.h" //头文件 #pragma comment(lib,"../../myDll/Release/myDll.lib") //调用自己写的外部库 #include int main() { CmyDll mydll; int a, b; std::cin >> a >> b; std::cout << mydll.myFunction(a, b) <> a >> b; std::cout << mydll.myFunction(a, b) << std::endl; return 0; } 3.dll放到可执行文件同一目录下面 刚刚的代码直接编译没问题,运行会报错. 直接编译没问题,运行会报错 原因是dll要和生成的可执行文件在同一个目录下,我把mydll.dll放进去之后就解决了。 我们成功的在自己的工程里调用了外部的类 可以看到我们成功的在自己的工程里调用了外部的类。
动态链接库是一种可重定位的二进制文件,它包含了一些可供其他程序调用的函数或数据。在 Windows 平台上,动态链接库采用 .dll 后缀名,而在 Linux 平台上则采用 .so 后缀名。在本文,我们将介绍如何使用 MFC 调用 C 语言编写的动态链接库。 # 创建动态链接库 在 Windows 平台上,可以使用 Visual Studio 创建动态链接库。下面是一个简单的示例: ```c // mydll.h #ifndef MYDLL_H #define MYDLL_H #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) int add(int a, int b); #ifdef __cplusplus } #endif #endif // MYDLL_H // mydll.c #include "mydll.h" int add(int a, int b) { return a + b; } ``` 这个动态链接库包含一个 add 函数,可以对两个整数求和。 # 调用动态链接库 在 MFC 项目调用动态链接库,需要进行以下几个步骤: 1. 定义一个函数指针类型,指向动态链接库的函数。 ```c++ typedef int (*AddFunc)(int, int); ``` 2. 加载动态链接库。 ```c++ HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } ``` 3. 获取动态链接库的函数地址。 ```c++ AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } ``` 4. 调用动态链接库的函数。 ```c++ int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); ``` 5. 卸载动态链接库。 ```c++ FreeLibrary(hinstLib); ``` 完整的 MFC 代码示例: ```c++ typedef int (*AddFunc)(int, int); void CMyDlg::OnButton1() { HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); FreeLibrary(hinstLib); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值