Foxmail★Blog

——朱俊Blog

用户操作
[即时聊天] [发私信] [加为好友]
朱俊ID:foxmail
138146次访问,排名656,好友0人,关注者1人。
foxmail的文章
原创 100 篇
翻译 0 篇
转载 10 篇
评论 235 篇
最近评论
vvukqr:WoW Gold
ym:好文才,对我就像醍醐灌顶
阿豪:你的墙纸设置方法有问题,无法设置jpg和gif,只能设置bmp。如果设置图片为jpg和gif墙纸没有任何变化。如果你感兴趣,我可以把代码发给你看看,看看到底是你的方法有问题还是我做得不对。
nqh@exchange.ricsson.com
xiaopianzi:看到你对svm有研究,所以请问svmlight多分类预测时,我连网页上提供的exampel效果都不好,怎么回事?参数的选定有没有窍门?还有libsvm我用它作多分类预测,总是报错!怎么回事?请指教!!!
egxsun:要是加flash,怎么改这段:if (filmURL != null) {
filmstring = '<object classid=""clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6"" id=""WindowsMediaPlayer1"">'; ……
文章分类
收藏
相册
Funny
文章用图
朱俊
我的主页
MSN Space
中国人工智能网
恋雪
步天软件
留言
连连看
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 delete this,dll导出类及如何写plugins(PART II) [转]收藏

新一篇: delete this,dll导出类及如何写plugins(PART III) [转] | 旧一篇: A love before time

2.dll导出类的几种方法。
其实我就知道两种啦,还请大家补充。
先看M$使用的方法。
struct exports{
__declspec(dllexport)exports();
__declspec(dllexport)~exports();
};
exports::exports(){}
exports::~exports(){}
优点:完全和本地的类一样使用,可以直接new/delete.
缺点:只能使用自动连接(就是连lib的),自由度不高。
不能通过选择dll的方式来转换插件(可以通过替换dll文件实现,但是不能保证对所有的修改后的类通用)
继承exports后没有办法通过同一个接口调用子类函数。(因为你永远new的都是父类,除非重新编译原来的main程序)

另外一个方法:
这样声明exports类:
;//exports.h
struct exports{
friend exports* CreateExports(LPVOID lpparm);
virtual int AddRef();
virtual int Release();//前面讲过的方法,如果不清楚请看第一篇delete this
virtual do_sth()=0;//所有成员函数均为虚函数,基类可以纯虚。
protected:
exports(){}
virtual ~exports(){}
}
extern "C" CreateExports函数是dll的输出函数。
编译exports.cpp成exports.dll
然后在main.cpp:
#include "windows.h"
#include "exports.h"
void main()
{
LoadLibrary("exports");....
PCreateExports=GetProcAddress("CreateExports"....);...
exports* pex=pCreateExports(NULL);
pex->do_sth();
pex->Release();
}
 

Q:为什么要使用protected的构造函数。
A:因为我不希望exports类被直接使用(这样就没有办法实现多态了,因为new不到子类),所以protected它的构造函数。
这样在程序里面你只能通过CreateExports来得到Exports类的指针。而CreateExports返回的类是通过lpparm来确定的,这样就实现了多态性。


Q:为什么要使用delete this 的方法(AddRef/Release)。
A:因为exports类是从dll里面new出来的,所以一定需要在dll里面delete,所以使用这个方法,否则会内存泄漏。


Q:为什么所有成员函数均为虚函数。
A:如果不是虚函数,其实再连接的时候成员函数是会连接代码到.exe里面去的,这样就根本call不到dll里面的函数,也就没有实现我们的原意。
而虚函数是通过函数指针调用的,exports类是再dll里面构造,所以可以保证虚函数是call到dll里面,而且.exe只需要dll的头文件即可编译连接通过。

发表于 @ 2004年09月29日 13:57:00|评论(loading...)|编辑

新一篇: delete this,dll导出类及如何写plugins(PART III) [转] | 旧一篇: A love before time

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © Foxmail