对于.net或是java,代码的重用一般是通过编写dll文件,在项目中引用dll完成,很简单也很直观,或是使用pinvoke技术,调用com组件,socket,webservice等,也有大量的例子,很容易上手。vc也有自己特有的方式,主要有以下几种:
一,通过静态lib文件和h文件进行代码重用
lib有静态lib和动态lib之分。静态lib将导出声明和实现都放在lib中,编译后所有代码都嵌入到宿主程序;动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明,编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持。关于动态lib的使用后续再讲解,先讲静态的lib。
1,创建静态lib文件:
打开vc6.0,新建一个"win32 static library"工程,工程名为"staticlibdemo"。
增加"staticlibdemo.h"文件。
// staticlibdemo.h
class staticlibdemo
{
public:
staticlibdemo();
int MathAdd(int a, int b);
};
//
增加"staticlibdemo.cpp"文件。
// staticlibdemo.cpp
#include "staticlibdemo.h"
staticlibdemo::staticlibdemo()
{
}
int staticlibdemo::MathAdd(int a, int b)
{
return a+b;
}
//
编译之后,将产生staticlibdemo.lib,宿主程序使用时,需要staticlibdemo.lib以及staticlibdemo.h两个文件(发布时也发布这两个文件)。
2,使用静态lib文件:
使用静态lib文件的方法有多种,这里只列举其中一种。
把前面发布的两个文件拷贝到机器上,并添加系统目录。tools - options - directories,分别在include files中增加h文件目录,在library files中增加lib文件目录。(如果后续编译出错,可以尝试把添加的路径往上移)。
[替代方案,也可以不进行此项配置,但后续的include和lib文件需要指定绝对路径]
打开vc6.0,新建一个"win32 console application"工程,工程名为"consoledemo"。
工程中增加对lib的引用。project - settings - link - category(input) - object/library modules中增加lib文件名,如"staticlibdemo.lib"。
[替代方案一,可以project>add to project>files的方式将.lib加入工程]
[替代方案二,#pragma comment(lib, "your lib path and name"),与头文件一样,也可以不在这里指定路径,而是在project>settings>link>input的Additional library path中输入.lib文件所在路径]
在需要使用lib的文件中添加头文件引用。如#include "staticlibdemo.h"。举例main.cpp如下:
// main.cpp
#include<iostream>
#include "staticlibdemo.h"
using namespace std;
int main ()
{
staticlibdemo biz;
int s = biz.MathAdd(1,2);
cout << "s=" << s << endl;
return 0;
}
//
需要注意的是,如果静态lib更新,则需要再编译所有相关的工程。
二,通过动态链接库dll,lib文件和h文件进行代码重用
与第一种方法类似,区别是宿主程序采用动态链接的方式调用dll,在发布重用的代码时,除了lib文件和h文件,还需要发布dll文件。
1,创建带有lib文件的dll文件:
打开vc6.0,新建一个"win32 dynamic-link library"工程,工程名为"dlldemo"。
添加funcexport.h。这个文件声明了需要输出的函数,如果一个dll没有任何东西输出那么不会有对应的lib文件,但只要一个dll输出一个变量或函数就会相应的lib文件。
// funcexport.h
extern "C" {
__declspec(dllexport) int MathAdd(int a, int b);
}
//
添加mathex.h。
// mathex.h
class mathex
{
public:
mathex();
int MathAdd(int a, int b);
};
//
添加mathex.cpp。
// mathex.cpp
#include "mathex.h"
mathex::mathex()
{
}
int mathex::MathAdd(int a, int b)
{
return a+b;
}
//
添加funcexport.cpp。
// funcexport.cpp
#include "funcexport.h"
#include "mathex.h"
int MathAdd(int a, int b)
{
mathex biz;
return biz.MathAdd(a,b);
}
//
编译后将产生dlldemo.dll,dlldemo.lib,连同funcexport.h一起发布。
2,使用dll:
使用带有lib文件的动态链接库方法与使用静态链接库类似,区别是运行时,需要把dll文件放到运行目录,或是系统目录,或是配置了环境变量的目录下。
三,通过动态链接库dll进行代码重用
// main.cpp
#include<iostream>
#include<windows.h>
#include "util.h"
using namespace std;
// 定义一个函数指针
typedef int (*MATHADDFUNC)(int,int);
int main ()
{
util u;
int s = u.MathAdd(1,2);
cout << "s=" << s << endl;
//定义一个函数指针变量
MATHADDFUNC mathaddFunc;
//加载dll
HINSTANCE hinst=::LoadLibrary("dlldemo.dll");
//找到dll的MathAdd函数
mathaddFunc=(MATHADDFUNC)GetProcAddress(hinst,"MathAdd");
//调用dll里的函数
s = mathaddFunc(2,2);
// release
FreeLibrary(hinst);
mathaddFunc = NULL;
hinst = NULL;
cout << "s=" << s << endl;
cin>>s;
return 0;
}
//
四、直接通过h文件和cpp文件进行代码重用
即是把.h和.cpp放到指定的公共目录下,然后在需要引用的多个不同项目中直接把现有的代码文件添加到各个项目,从而实现代码重用,个人感觉与静态lib的方式差不多,不同的是修改了公共代码之后,不需要编译lib,只需要编译各个引用的项目即可。