常规DLL中导出类到C++程序并使用和继承,请教我方法

nomadfsw 2005-01-17 01:05:03
美女MM我想出此法在DLL中导出类到C++程序中,可是我想知道其它方法,请高手帮我想想其它方法

1.在DLL中封装类ClassA,并封装一类C函数Out(void),其返回值为一指向DLL中类对象的指针
数据成员全部定义成指针形式
2.生成DLL文件
3.在使用DLL文件的C++程序中定义一个类ClassTemp,这个类中有DLL中待导出的类的所有方法申明(没有实现过程)
4.调用DLL中的类C函数导出类指针并强制转化为(ClassTemp *)类型,赋给类型为(ClassTemp *)的变量pTemp;
即ClassTemp *pTemp = ( ClassTemp * )Out(void)
5.在C++程序中定义导出类ClassAout,其包括ClassA的同样的数据成员(非指针形式)及所有方法,
所有方法实现用pTemp间接获得;通过在ClassAout的购造函数中显式调用ClassA中的构造函数,所有数据成员的地址被赋给ClassA中的对应数据成员的指针。

6.这时,ClassAout便为DLL中类ClassA的导出类,其和ClassA的功能完全一样。并可以在C++程序中继成和使用。

以下是导出DLL中的类A的例子:(伪码描述)

DLL中封装有类:
class A
{
public:
void f1( void )
{
std::cout<<"I love U";
}

A( int *temp )
{
i = temp;
}
privace:
int *i;
}
DLL中封装有类C函数:
A *Out(void)
{
A *ret = new A;
return ret;
};

在C++程序中定义类
Class Temp
{
public:
void f1( void );//只是申明没有实现
Temp( int * );//只是申明没有实现
};
得到DLL中A类对象指针:
Temp *pTemp = Out();//这句要写在导出类的构造函数中

又在C++程序中定义类
Class Aout
{
public:
void f1( void )//通过pTemp间接获得方法实现
{
(*pTemp).f1();
}
Aout()
{
...
Temp *pTemp = Out();//得到DLL中A类对象指针
(*pTemp).A( &i );//所有数据成员的地址被赋给ClassA中的对应数据成员的指针

}
privace:
int i;
};

类Aout则为和DLL中类A完全功能一样的类,可以使用和继承。

这方法我还没有做实验验证,请高手指点


...全文
729 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
netsbull 2005-01-19
  • 打赏
  • 举报
回复
ddf
nomadfsw 2005-01-19
  • 打赏
  • 举报
回复
DLL就是可以被程序运行时链接的一种程序模块,可以单独编译
谢谢翔天大哥
愿你有份好心情
TomDebug 2005-01-19
  • 打赏
  • 举报
回复
低低的问一下:
虾米是DLL啊,学这么久C++,怎么不懂啊?
nicknide 2005-01-19
  • 打赏
  • 举报
回复
首先说明楼上有人说这个是COM的原理,实际上是不对的,如果有异议,可以参看COM本质论上关于COM基本思想的章节,记得没错的话,应该是前4章。

以下是我写的一个常规导出类,直接导出,不过不可2进制兼容:
如果希望兼容,建议全部用工厂方法+Destory虚函数,还有,析构函数不能用虚(用虚Destory间接引用的话,析构没有问题:此法出自《COM本质论》)

//2进制串的一个类,以下是声明
//在VC上编译成DLL,可以正常通过(我也还没有使用到它)

//同样的方法,如果在某个平台上编译,则
//在相同平台上可以直接使用,所以如果楼主
//如果没有要求2进制移植的话,可以直接这样写,
//没有问题
class __declspec (dllexport)
Binary
{
class Bit;
public:
Binary();
Binary(const Binary&);
explicit Binary(const char* data);
explicit Binary(unsigned int length);
~Binary();
Bit operator [](unsigned int);

//将Binary扩展成为32位对齐
Binary& Fill();

unsigned int Length()const;
unsigned int Space(unsigned int);

Binary& operator = (const Binary&);
Binary& operator +=(const Binary&);
Binary& operator +=(char);
operator const unsigned int*()const;

private:
//用代理访问位,此为代理
class __declspec (dllexport) Bit
{
public:
operator char()const;
operator int()const;
Bit operator = (int); // Must: 0 | 1;
Bit operator = (char); // Must: '0' | '1';
Bit operator = (const Bit&);//Cann't Return By Ref ,Return By Value
bool operator == (char);
~Bit();

private:
Bit();
Bit(unsigned int* from,unsigned int position,int result);
Bit(Bit&);//!!!WARNING :本函数只限编译器内部自动调用,请不要擅自动用;

private:
/////////////////////////////////////////////
//
#pragma pack(push,4)
union
{
unsigned int flat_;
struct
{
unsigned int ifChanged_ :1;
unsigned int noChanged_ :1;
unsigned int bitData_ :1;
unsigned int :5;
unsigned int offset_ :8;
};
};
#pragma pack(pop)
//
/////////////////////////////////////////////

unsigned int* from_;

friend class Binary;
};

unsigned int* data_;
unsigned int length_;
unsigned int space_;
};

楼主理解有偏差的地方就在于不同类型的强制转换,因为你没有实现那个过程,所以无法执行函数过程,否则链接报错……
而且你对于导出的数据成员理解有误,使用指针和使用普通的数据,其实本质上是一样的,在2进制来看,是无差别对待的。

以上是我的理解,希望指正……

BTW,可以看看《COM本质论》,上面对于类的导出有很不错的演绎推理过程……
xue23 2005-01-17
  • 打赏
  • 举报
回复
通过实验,这种方法是可行的,
有一点要注意要在类上添加个输出标志
class __declspec(dllimport) A
{
}
nomadfsw 2005-01-17
  • 打赏
  • 举报
回复
谢谢大哥们,小妹我谢谢了,但还是求其它方法能在常规DLL中(不是MFC扩展DLL中)导出类.请大哥们指点!
xue23 2005-01-17
  • 打赏
  • 举报
回复
实现上,COM技术就是使用的这样的方法。但是这样的方法能不能一般的DLL中实现,还有等实验。
oyljerry 2005-01-17
  • 打赏
  • 举报
回复
根据头文件和dll,然后借助函数指针,就可以了

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧