版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
前言
这部分知识算是必须要掌握的吧。
我使用的是VS2017,其实我觉得哪个版本都没太大区别,VS2013或是VS2019。
第一步:创建DLL项目
第二步:新建类test&新建测试项目
APP这个项目和Dll_Try建立在一起:在解决方案’Dll_Try’上右击,选择添加新项目,选择Windows控制台项目。
APP是Windows控制台项目,用来测试制作的动态链接库。Dll_Try是制作DLL的项目。
新建的测试类就是test.h与test.cpp两个文件,单单建这两个文件就好了,内容反正是要重写的。这个DLL项目下的其他文件不用动。
第三 步:给test.h&test.cpp添加内容
//test.h
#pragma once
#ifdef TEST_EXPORT
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
/*
__declspec(dllimport) 原来dllimport是为了更好的处理类中的静态成员变量的,
如果没有静态成员变量,那么没有__declspec(dllimport)无所谓。
*/
//非成员变量
extern TEST_API int dem;
class A {
public:
//成员函数
static TEST_API void output();
static TEST_API void setVar(int var);
private:
//成员变量
static int m_a;
};
//非成员函数
TEST_API void input();
//类
class TEST_API test
{
public:
test();
~test();
int add(int a, int b);
};
//test.cpp
#include "stdafx.h"
#include<iostream>
#include "test.h"
//非成员变量初始化
int dem =20;
//成员变量初始化
int A::m_a=12;
//修改m_a
void A::setVar(int var) {
std::cout << "Dll_Try>setVar function" << std::endl;
m_a = var;
}
void A::output() {
std::cout << "Dll_Try>"<<m_a << std::endl;
}
void input() {
int a=0;
std::cout << "Dll_Try>";
scanf_s("%d", &a);
std::cout << "Dll_Try>"<<a << std::endl;
}
test::test()
{
}
test::~test()
{
}
int test::add(int a, int b) {
std::cout << "Dll_Try>"<<a+b << std::endl;
return a + b;
}
第四步:生成这个DLL项目
可以直接按CTRL+F5,笔记本上按CTRL+Fn+F5
或者在DLL项目上右击,选择生成。
- 第一次生成一般不会出错,之后再生成就会出错了。无论修改成什么样,都会跳出无法启动DLL,这不是有效的Win32程序。
如果你真的修改了DLL项目,那么生成还是能做到的,输出还是会显示成功1,失败0.但是成功后还是会跳出这个错误,解决方法就是不用管,关掉这个框就行。
第五步:在APP这个项目里做测试
首先在解决方案’Dll_Try’右击,选择当前选定项目。
修改APP.cpp这个源文件
// APP.cpp
#include "pch.h"
#include <iostream>
#include"..\Dll_Try\test.h"
#pragma comment(lib,"Dll_Try.lib")
using namespace std;
int main()
{
test a;
cout << a.add(23, 44) << endl;
A b;
b.output();//输出静态成员变量
b.setVar(12213);//修改m_a
b.output();//输出静态成员变量
input();
cout << "dem>"<<dem << endl;
dem = 123;//修改dem
cout << "dem>"<<dem << endl;
}
由于#pragma comment(lib,"Dll_Try.lib")
这里似乎不能用相对路径,所以需要每次自己找到那两个静态库和动态库文件才行。
每次修改生成DLL项目后,都需要将这两个文件复制到APP项目下做测试。
编译运行结果: