DLL導出類(轉)
DLL中定義的類可以在應用工程中使用。
下面的例子里,我們在DLL中定義了point和circle兩個類,并在應用工程中引用了它們(單擊此處下載本工程
附件)。
//文件名:point.h,point類的聲明
#ifndef POINT_H
#define POINT_H
#ifdef DLL_FILE
class _declspec(dllexport) point //導出類point
#else
class _declspec(dllimport) point //導入類point
#endif
{
public:
float y;
float x;
point();
point(float x_coordinate, float y_coordinate);
};
#endif
//文件名:point.cpp,point類的實現(xiàn)
#ifndef DLL_FILE
#define DLL_FILE
#endif
#include "point.h"
//類point的缺省構造函數(shù)
point::point()
{
x = 0.0;
y = 0.0;
}
//類point的構造函數(shù)
point::point(float x_coordinate, float y_coordinate)
{
x = x_coordinate;
y = y_coordinate;
}
//文件名:circle.h,circle類的聲明
#ifndef CIRCLE_H
#define CIRCLE_H
#include "point.h"
#ifdef DLL_FILE
class _declspec(dllexport)circle //導出類circle
#else
class _declspec(dllimport)circle //導入類circle
#endif
{
public:
void SetCentre(const point ¢rePoint);
void SetRadius(float r);
float GetGirth();
float GetArea();
circle();
private:
float radius;
point centre;
};
#endif
//文件名:circle.cpp,circle類的實現(xiàn)
#ifndef DLL_FILE
#define DLL_FILE
#endif
#include "circle.h"
#define PI 3.1415926
//circle類的構造函數(shù)
circle::circle()
{
centre = point(0, 0);
radius = 0;
}
//得到圓的面積
float circle::GetArea()
{
return PI *radius * radius;
}
//得到圓的周長
float circle::GetGirth()
{
return 2 *PI * radius;
}
//設置圓心坐標
void circle::SetCentre(const point ¢rePoint)
{
centre = centrePoint;
}
//設置圓的半徑
void circle::SetRadius(float r)
{
radius = r;
}
類的引用:
#include "..\circle.h" //包含類聲明頭文件
#pragma comment(lib,"dllTest.lib");
int main(int argc, char *argv[])
{
circle c;
point p(2.0, 2.0);
c.SetCentre(p);
c.SetRadius(1.0);
printf("area:%f girth:%f", c.GetArea(), c.GetGirth());
return 0;
}
從上述源代碼可以看出,由于在DLL的類實現(xiàn)代碼中定義了宏DLL_FILE,故在DLL的實現(xiàn)中所包含的類聲明實際上為:
class _declspec(dllexport) point //導出類point
{
…
}
和
class _declspec(dllexport) circle //導出類circle
{
…
}
而在應用工程中沒有定義DLL_FILE,故其包含point.h和circle.h后引入的類聲明為:
class _declspec(dllimport) point //導入類point
{
…
}
和
class _declspec(dllimport) circle //導入類circle
{
…
}