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

原创 2001年07月12日 09:48:00
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
      3  0 00001700 PSEgetLibName
      2  1 00001710 PSEgetLibType
      4  2 00001720 PSEgetLibVersion
      6  3 00001800 SPUabout
     11  4 00001EE0 SPUclose
      5  5 00001730 SPUconfigure
     18  6 00002090 SPUgetOne
      7  7 00001910 SPUinit
     10  8 00001B90 SPUopen
     23  9 00002270 SPUplayADPCMchannel
     12  A 00002250 SPUplaySample
     17  B 00002050 SPUputOne
     19  C 000020B0 SPUsetAddr
     20  D 000020E0 SPUsetPitch
     21  E 00002110 SPUsetVolumeL
     22  F 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的功能。
 
 
不知道还有没有什么遗漏啊,请大家指教了......
 
多提意见:)
 
 
 
 

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

3.实现plugins。有了前两章的基础,这个就比较好办了。先了解一点点基本概念:Q:what is pluginsA:就是通过加载不同的dll实现不同的功能,或者附加的功能,典型的如模拟器的各种插件...
  • foxmail
  • foxmail
  • 2004年09月29日 13:59
  • 2085

delete this,dll导出类及如何写plugins

1.为什么要使用delete this,以及如何使用。(1)考查这样的情况:有两个对象A,B需要访问同一个多态对象C。因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并...
  • panyc33
  • panyc33
  • 2010年07月23日 20:51
  • 411

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

1.为什么要使用delete this,以及如何使用。(1)考查这样的情况:有两个对象A,B需要访问同一个多态对象C。因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并...
  • foxmail
  • foxmail
  • 2004年09月22日 15:09
  • 1558

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

2.dll导出类的几种方法。其实我就知道两种啦,还请大家补充。先看M$使用的方法。struct exports{__declspec(dllexport)exports();__declspec(dl...
  • foxmail
  • foxmail
  • 2004年09月29日 13:57
  • 1391

delete this,dll导出类及如何写plugins(PART II)

2.dll导出类的几种方法。其实我就知道两种啦,还请大家补充。先看M$使用的方法。struct exports{__declspec(dllexport)exports();__declspec(dl...
  • Augusdi
  • Augusdi
  • 2009年10月08日 16:30
  • 1088

delete this,dll导出类及如何写plugins(PART I)

1.为什么要使用delete this,以及如何使用。(1)考查这样的情况:有两个对象A,B需要访问同一个多态对象C。因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并...
  • Augusdi
  • Augusdi
  • 2009年10月08日 16:29
  • 893

delete this,dll导出类及如何写plugins(PART I)

 1.为什么要使用delete this,以及如何使用。(1)考查这样的情况:有两个对象A,B需要访问同一个多态对象C。因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,...
  • Kevin_qing
  • Kevin_qing
  • 2001年07月12日 09:38
  • 1294

delete this,dll导出类及如何写plugins(PART II)

2.dll导出类的几种方法。其实我就知道两种啦,还请大家补充。先看M$使用的方法。struct exports{__declspec(dllexport)exports();__declspec(dl...
  • Kevin_qing
  • Kevin_qing
  • 2001年07月12日 09:44
  • 1073

DLL编程05 _delete this,dll导出类及如何写plugins(PART III)

3.实现plugins。有了前两章的基础,这个就比较好办了。先了解一点点基本概念:Q:what is pluginsA:就是通过加载不同的dll实现不同的功能,或者附加的功能,典型的如模拟器的各种插件...
  • dengrk
  • dengrk
  • 2007年12月14日 08:44
  • 444

Could not delete F:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/platfor

右键 tomcat    clean
  • qing_mei_xiu
  • qing_mei_xiu
  • 2016年09月14日 17:54
  • 5117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delete this,dll导出类及如何写plugins(PART III)
举报原因:
原因补充:

(最多只允许输入30个字)