• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • delete this,dll導出類及如何寫plugins(PART III)

    發表于:2007-05-25來源:作者:點擊數: 標簽:deletethis導出Pluginsdll
    3.實現plugins。 有了前兩章的基礎,這個就比較好辦了。 先了解一點點基本概念: Q:what is plugins A:就是通過加載不同的dll實現不同的功能,或者附加的功能,典型的如模擬器的各種插件(顯示,input...)。 Q:why we use plugins A:主要為了使程序模塊化,并
    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插件的輸出表??梢钥吹絜psxe就是通過這些函數與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的功能。
     
     
    不知道還有沒有什么遺漏啊,請大家指教了......
     
    多提意見:)

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>