分享
 
 
 

delete this,dll导出类及如何写plugins(PART III) [转]

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

3.实现plugins。

有了前两章的基础,这个就比较好办了。

先了解一点点基本概念:

Q:what is plugins

A:就是通过加载不同的dll实现不同的功能,或者附加的功能,典型的如模拟器的各种插件(显示,input...)。

Q:why we use plugins

A:主要为了使程序模块化,并且容易扩充。升级组件时不需要重新发布整个产品。

Q:how to do it?

A:使用LoadLibrary来加载具有相同接口(一般是函数,不过我们这里会使用C++类实现)的不同dll,实现/(扩充)功能。

例子:

D:\ePsxe\plugins>dumpbin spuseal.dll /exports

Microsoft (R) COFF Binary File Dumper Version 6.00.8447

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

Dump of file spuseal.dll

File Type: DLL

Section contains the following exports for spuSeal.dll

0 characteristics

36A22A22 time date stamp Sun Jan 17 10:21:22 1999

0.00 version

2 ordinal base

22 number of functions

22 number of names

ordinal hint RVA name

30 00001700 PSEgetLibName

21 00001710 PSEgetLibType

42 00001720 PSEgetLibVersion

63 00001800 SPUabout

114 00001EE0 SPUclose

55 00001730 SPUconfigure

186 00002090 SPUgetOne

77 00001910 SPUinit

108 00001B90 SPUopen

239 00002270 SPUplayADPCMchannel

12A 00002250 SPUplaySample

17B 00002050 SPUputOne

19C 000020B0 SPUsetAddr

20D 000020E0 SPUsetPitch

21E 00002110 SPUsetVolumeL

22F 00002150 SPUsetVolumeR

8 10 00001B80 SPUshutdown

13 11 00002190 SPUstartChannels1

14 12 000021C0 SPUstartChannels2

15 13 000021F0 SPUstopChannels1

16 14 00002220 SPUstopChannels2

9 15 00001880 SPUtest

Summary

1000 .rsrc

96000 UPX0

5000 UPX1

D:\ePsxe\plugins>

这个是epsxe的一个sound插件的输出表。可以看到epsxe就是通过这些函数与dll通信的。

进入正题:

从一个dll里面输出这么多函数实在是一个很烦的事情,而且一个个的去GetProcAddr也很麻烦,

能不能用简单一些的方法呢?

当然是可以的了,使用我们前面介绍的dll输出类技术2就可以了。

还是看代码,我们做一个input的plugins类。

;//input.h

class input{

virtual int Addref()=0;

virtual int Release()=0;

virtual DWORD QueryClsID()=0;//identify this is a input plugins;

virtual DWORD IsSupport(DWORD flags)=0;

virtual bool GetXY(int&x,int&y)=0;

virtual DWORD GetButtonStat()=0;

virtual bool AddEffect(DWORD id,DWORD level)=0;

virtual bool QueryInterface(DWORD clsid,LPVOID* ppVoid);//留待扩充。越来越像COM了。

virtual bool DoConfig();

protected:

input();

virtual ~input();

};

--------------------------------------------------------

;//mouseinput.h

class MouseInput

:public input

{

protected:

friend input* CreateInput(LPVOID pVoid);

;//...............

};

--------------------------------------------------------

;//mouseinput.cpp

input* CreateInput(LPVOID pVoid){return new mouseinput;};

--------------------------------------------------------

;//keyinput.h

class KeyInput

:public input

{

protected:

friend input* CreateInput(LPVOID pVoid);

;//...............

};

--------------------------------------------------------

;//keyinput.cpp

input* CreateInput(LPVOID pVoid){return new keyinput;};

编译后就得到了mouseinput.dll和keyinput.dll

他们分别输出mouseinput类和keyinput类,而外部程序是通过input的接口来调用他们,从而实现了plugins的功能。

不知道还有没有什么遗漏啊,请大家指教了......

多提意见:)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有