首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么创建IE工具条,请下面的代码

2012-03-02 
如何创建IE工具条,请高手指点下面的代码?找到一篇介绍写IE工具条的文章:------------------------------往

如何创建IE工具条,请高手指点下面的代码?
找到一篇介绍写IE工具条的文章:
------------------------------
往IE中嵌入工具条            

我们首先要建立一个ActiveX   Library。将其保存为MailIEBand.Dpr;
然后建立一个COM   Object,将其保存为BandUnit.pas;然后建立一个Form,
这个窗口将作为子窗口显示在IE工具栏中,将窗口的BorderStyle属性改为bsNone,
添加一个TButton组件和一个TComboBox组件,将TButton的Caption属性改为获取全部,
然后将窗口文件其保存为IEForm.pas。
在BandUnit中,需要建立一个实现上面提到的接口的TComObject对象。如下:
TGetMailBand   =   class(TComObject,   IDeskBand,   IObjectWithSite,   IPersistStreamInit)

另外由于需要在COM服务器注册时添加一些注册表信息,
所以还需要建立一个继承自TComObjectFactory类的对象,
在对象的UpdateRegistry事件中编写代码添加附加的注册表信息。

下面的程序清单1-6到1-8是实现COM服务器的全部程序代码:

程序清单1-6   MailIEBand.dpr
library   MailIEBand;

uses
    ComServ,
    BandUnit   in   'BandUnit.pas ',
    IEForm   in   'IEForm.pas '   {Form1},
    MailIEBand_TLB   in   'MailIEBand_TLB.pas ';

exports
    DllGetClassObject,
    DllCanUnloadNow,
    DllRegisterServer,
    DllUnregisterServer;

{$R   *.TLB}

{$R   *.RES}

begin
end.

程序清单1-7   BandUnit.pas

unit   BandUnit;

interface

uses
    Windows,   Sysutils,   Messages,   Registry,   Shellapi,   ActiveX,   Classes,   ComObj,
      Shlobj,   Dialogs,   Commctrl,ShDocVW,IEForm;

type
    TGetMailBand   =   class(TComObject,   IDeskBand,   IObjectWithSite,   IPersistStreamInit)
    private
            frmIE:TForm1;
            m_pSite:IInputObjectSite;
        m_hwndParent:HWND;
        m_hWnd:HWND;
        m_dwViewMode:Integer;
            m_dwBandID:Integer;
      protected

      public
        {Declare   IDeskBand   methods   here}
            function   GetBandInfo(dwBandID,   dwViewMode:   DWORD;   var   pdbi:   TDeskBandInfo):
                  HResult;   stdcall;
            function   ShowDW(fShow:   BOOL):   HResult;   stdcall;
            function   CloseDW(dwReserved:   DWORD):   HResult;   stdcall;
            function   ResizeBorderDW(var   prcBorder:   TRect;   punkToolbarSite:   IUnknown;
                  fReserved:   BOOL):   HResult;   stdcall;
            function   GetWindow(out   wnd:   HWnd):   HResult;   stdcall;
            function   ContextSensitiveHelp(fEnterMode:   BOOL):   HResult;   stdcall;

            {Declare   IObjectWithSite   methods   here}
            function   SetSite(const   pUnkSite:   IUnknown   ):HResult;   stdcall;
            function   GetSite(const   riid:   TIID;   out   site:   IUnknown):HResult;stdcall;



            {Declare   IPersistStream   methods   here}
            function   GetClassID(out   classID:   TCLSID):   HResult;   stdcall;
            function   IsDirty:   HResult;   stdcall;
            function   InitNew:   HResult;   stdcall;
            function   Load(const   stm:   IStream):   HResult;   stdcall;
            function   Save(const   stm:   IStream;   fClearDirty:   BOOL):   HResult;   stdcall;
            function   GetSizeMax(out   cbSize:   Largeint):   HResult;   stdcall;
    end;

const
    Class_GetMailBand:   TGUID   =   '{954F618B-0DEC-4D1A-9317-E0FC96F87865} ';
    //以下是系统接口的IID
    IID_IUnknown:   TGUID   =   (
            D1:$00000000;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
    IID_IOleObject:   TGUID   =   (
            D1:$00000112;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
    IID_IOleWindow:   TGUID   =   (
            D1:$00000114;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));

    IID_IInputObjectSite   :   TGUID   =   (
            D1:$f1db8392;D2:$7331;D3:$11d0;D4:($8C,$99,$00,$A0,$C9,$2D,$BF,$E8));
    sSID_SInternetExplorer   :   TGUID   =   '{0002DF05-0000-0000-C000-000000000046} ';
    sIID_IWebBrowserApp   :   TGUID=   '{0002DF05-0000-0000-C000-000000000046} ';

    //面板所允许的最小宽度和高度。
    MIN_SIZE_X   =   54;
    MIN_SIZE_Y   =   22;
    EB_CLASS_NAME   =   'GetMailAddress ';
implementation

uses   ComServ;


function   TGetMailBand.GetWindow(out   wnd:   HWnd):   HResult;   stdcall;
begin
      wnd:=m_hWnd;
      Result:=S_OK;
end;

下面的我就不写了,都在这里:
http://www.codesky.net/article/doc/200309/2003091647837714.htm

----------------------------
但我把手里的Delphi的书中讲COM的章节读了一遍,仍不明白:
const
    Class_GetMailBand:   TGUID   =   '{954F618B-0DEC-4D1A-9317-E0FC96F87865} ';
    //以下是系统接口的IID
    IID_IUnknown:   TGUID   =   (
            D1:$00000000;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
    IID_IOleObject:   TGUID   =   (
            D1:$00000112;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
    IID_IOleWindow:   TGUID   =   (
            D1:$00000114;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));

    IID_IInputObjectSite   :   TGUID   =   (
            D1:$f1db8392;D2:$7331;D3:$11d0;D4:($8C,$99,$00,$A0,$C9,$2D,$BF,$E8));
    sSID_SInternetExplorer   :   TGUID   =   '{0002DF05-0000-0000-C000-000000000046} ';


    sIID_IWebBrowserApp   :   TGUID=   '{0002DF05-0000-0000-C000-000000000046} ';

这些关于接口的定义,是系统自动生成的还是程序员手工输入的?如果是系统自动生成怎么操作能得到这些代码,手工输入的我怎么知道TGUID的值及需要定义哪些接口?    


[解决办法]
New | ActiveX | COM Object出现COM Object Wizard
class name项输入GetMailBand
去掉复选Include type library
点击OK

uses相应的单元
在生成的代码中,把TGetMailBand的声明改成
TGetMailBand = class(TComObject, IDeskBand, IObjectWithSite, IPersistStreamInit)

const部分:
Class_GetMailBand: TGUID =是自动生成的
其它GUID都是在相应的单元文件里


热点排行