按照项目的要求,在把代码工程给甲方爸爸之前,需要隐藏一些关键技术,把cpp给隐藏。
方法一:链接Obj文件
学编程的都知道,生成工程前需要先编译再链接,所以首先我们编译一遍工程,然后在项目工程的debug目录找到需要链接的obj文件,这里我们用以下文件作为实列
然后我们复制一份工程作为给甲方的代码,在复制的工程下把上面相应的cpp从工程中移除,选中MenDB.cpp文件,右键选中移除,若是能删除选删除,否则还要在工程目录中找到并删除。
删除上述文件后,在项目->属性->链接器->输入->附加依赖项,添加需要隐藏的cpp生成的obj链接文件,
若是你的obj文件不在工程目录里面,需要在项目->属性->链接器->常规->附加库目录下添加包含的目录,因为有三个文件在AllProcessDefinition这个文件下,所以需要包含文件目录
然后rebuild(重新生成)工程,会看到链接obj文件过程,并生成可执行程序exe,成功隐藏cpp文件。
方法二:使用动态库导出类
本来想用这种方法结合工厂类来隐藏,但是工程中的基类实现中包含一些其他文件的全局变量,若是做成动态库肯定还需要链接这些全局变量,很是麻烦。但是自己还是学一学这种方法以作积累。
若是你以前编写过函数的dll,那编写C++导出类的dll就比较简单,只需要在导出类名前关键字class后加上_declspec(dllexport),就可以实现导出类。
这里使用VC++编写一个C++导出类的dll,虚基类ICalculate,派生三角Triangle 和圆Circular类
2.1编写导出类dll
新建空项目calculater,添加类ICalculate
.h文件
#pragma once
struct _declspec(dllexport) ICalculate
{
public:
//interface
virtual double GetArea() = 0;
virtual double GetPerimeter() = 0;
};
//正三角形
class _declspec(dllexport) Triangle : public ICalculate
{
public:
Triangle(double,double);
~Triangle()=default;
private:
double bottom;
double height;
public:
double GetArea();
double GetPerimeter();
};
//圆
class _declspec(dllexport) Circular: public ICalculate
{
public:
Circular(double);
~Circular()=default;
private:
double radius;
public:
double GetArea();
double GetPerimeter();
};
.cpp文件
#include "Calculate.h"
Triangle::Triangle(double bottom, double height)
{
this->bottom = bottom;
this->height = height;
}
double Triangle::GetArea()
{
return bottom * height / 2;
}
double Triangle::GetPerimeter()
{
return 3 * bottom;
}
Circular::Circular(double radius)
{
this->radius = radius;
}
double Circular::GetArea()
{
return 3.14*radius*radius;
}
double Circular::GetPerimeter()
{
return 2 * 3.14*radius;
}
在项目属性下,配置一下属性,选择动态库类型
编译生成项目,生成calculater.lib和calculater.dll文件,结果如下图所示:
2.2使用导出类
新建空项目calculatedlltest,新增cpp文件mainTest.cpp,添加类的头文件Calculate.h。
把生成的calculater.lib和calculater.dll文件复制到当前工程目录下。
在项目->属性->链接器->输入->附加依赖项,添加calculater.lib文件,注意需要”;“。
然后编写测试代码,mainTest.cpp的代码如下:
#include "Calculate.h"
#include <iostream>
using namespace std;
int main()
{
ICalculate* obj = new Triangle(10, 4);
ICalculate* obj2 = new Circular(10);
cout << obj->GetArea() << endl;
cout << obj->GetPerimeter() << endl;
cout << obj2->GetArea() << endl;
cout << obj2->GetPerimeter() << endl;
system("pause");
return 1;
}
运行结果如下图所示:
本人自身实验,若有错误,还请指出。