zoukankan      html  css  js  c++  java
  • 注册COM

    可以用代码在程序中实现COM的注册. 举例如下: 
    (假设需要注册的文件为test.ocx)
    uses OLEctl,....
    var
    OCXHand: THandle;
    RegFunc: TDllRegisterServer;
    begin
    OCXHand:= LoadLibrary('c:windowssystem est.ocx');
    RegFunc:= GetProcAddress(OCXHand, 'DllRegisterServer'); 
    if RegFunc <> 0 then ShowMessage('Error!');
    FreeLibrary(OCXHand);
    end;


    olectl.pas在source tlwin下.
    ///////////////////////
    在用DELPHI编写程序时,充分利用他人的成果无疑是一条捷径。我们用的控件有的是带源码的PAS文件,有的是DCU/OBJ文件;而OLE/COM控件也是不可缺少的,由于OLE/COM控件不仅可以由DELPHI开发,还可由VB、VC、PB等其它编程语言开发,因而它可以使我们的DELPHI应用程序功能更为强大,例如用一个MP3播放控件我们就可以编写自己的MP3播放程序,

    用ADO对象我们的数据库程序就可能不再依赖BDE。

      不过OLE/COM控件是需要首先注册才能使用的。通常使用OLE/COM控件,首先需要用WINDOWS自己提供的注册程序RegSvr32.EXE来注册或卸载,如“RegSvr32.EXE Mp3Play.OCX”或

    “RegSvr32.EXE Mp3Play.OCX /u”。不过如果要求我们的软件用户自己来注册OLE/COM控件,那可不是一个好主意,因为我们完全可以自己在程序中注册OLE/COM控件的。下面将讨论如何在DELPHI程序中注册最为常见的DLL/OCX类型的OLE/COM控件。


    一、注册OLE/COM控件的原理

      在标准OLE/COM控件中,有两个函数DllRegisterServer、DllUnregisterServer可调用,其中

    DllRegisterServer函数用于注册OLE/COM控件,DllUnregisterServer用于卸载OLE/COM控件,两个函数的原型均为:function : HResult。我们可用LoadLibrary装载DLL/OCX文件,用GetProcAddress获取DllRegisterServer和DllUnregisterServer两个函数的指针,然后再直接运行这两个函数即可实现注册和卸载OLE/COM控件的操作,从而代替WINDOWS系统的RegSvr32.exe实现OLE/COM控件的注册和卸载。


    二、实现过程

      上面的原理很简单,实现起来也就不难了,前提是必须熟悉动态加载DLL函数的过程。具体的实现

    过程我们可以通过下面的程序代码及注释来理解。

    { 注册一个DLL形式或OCX形式的OLE/COM控件

    参数strOleFileName为一个DLL或OCX文件名,

    参数OleAction表示注册操作类型,1表示注册,0表示卸载

    返回值True表示操作执行成功,False表示操作执行失败

    }

    function RegisterOleFile (strOleFileName : STRING; OleAction : Byte ) : BOOLEAN;

    const

    RegisterOle = 1;//注册

    UnRegisterOle = 0;//卸载

    type

    TOleRegisterFunction = function : HResult;//注册或卸载函数的原型

    var

    hLibraryHandle : THandle;//由LoadLibrary返回的DLL或OCX句柄

    hFunctionAddress: TFarProc;//DLL或OCX中的函数句柄,由GetProcAddress返回

    RegFunction : TOleRegisterFunction;//注册或卸载函数指针

    begin

    Result := FALSE;

    //打开OLE/DCOM文件,返回的DLL或OCX句柄

    hLibraryHandle := LoadLibrary(PCHAR(strOleFileName));

    if (hLibraryHandle > 0) then//DLL或OCX句柄正确

    try

    //返回注册或卸载函数的指针

    if (OleAction = RegisterOle) then//返回注册函数的指针

    hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllRegisterServer'))

    else//返回卸载函数的指针

    hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllUnregisterServer'));

    if (hFunctionAddress <> NIL) then//注册或卸载函数存在

    begin

    RegFunction := TOleRegisterFunction(hFunctionAddress);//获取操作函数的指针

    if RegFunction >= 0 then //执行注册或卸载操作,返回值>=0表示执行成功

    result := true;

    end;

    finally

    FreeLibrary(hLibraryHandle);//关闭已打开的OLE/DCOM文件

    end;

    end;


    三、应用举例

      在我们的应用例子中,OpenDialog1(TOpenDialog)用于选择一个DLL/COM文件,editOleFileName(TEdit)用于保存DLL/COM文件名称,radiogroupOleAction(TRadioGroup)用于选择操作类型(0-卸载、1-注册),memo1(TMemo)用来显示操作成功或失败的信息。具体的例子还是看程序源码吧。


    //选择一个DLL/COM文件

    procedure TForm1.Button2Click(Sender: TObject);

    begin

    if OpenDialog1.execute then //指定一个DLL/COM文件

    editOleFileName.text := OpenDialog1.FileName ;

    end;


    //注册一个DLL形式或OCX形式的OLE/COM控件

    procedure TForm1.Button1Click(Sender: TObject);

    begin

    if editOleFileName.text = '' then exit;//没有指定文件名则不予处理

    if RegisterOleFile( editOleFileName.text, radiogroupOleAction.ItemIndex )

    then//操作成功

    memo1.lines.add( DatetimeToStr( now ) + '----'+ editOleFileName.text

    + radiogroupOleAction.Items[ radiogroupOleAction.ItemIndex ] + '成功!' )

    else//操作失败

    memo1.lines.add( DatetimeToStr( now ) + '----'+ editOleFileName.text

    + radiogroupOleAction.Items[ radiogroupOleAction.ItemIndex ] + '失败!' );

    end;


      把注册OLE/COM控件功能作成一个OLE/COM或一般的DLL供其它程序调用,可以使其它应用程序也具有注册OLE/COM控件的功能。

  • 相关阅读:
    【读书笔记】iOS-验证应用内支付的凭证注意事项
    【读书笔记】iOS-防止通讯协议被轻易破解的方法
    【读书笔记】iOS-安全地传输用户密码的方法
    【读书笔记】iOS-使用应用内支付注意事项
    【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码
    【读书笔记】iOS-UIFont-动态下载系统提供的多种中文字体网址
    【读书笔记】iOS-UIFont-如何知道字体的PostScript名称
    【读书笔记】iOS-UIWindow-密码框
    【读书笔记】iOS-UIWindow-WindowLevel
    【读书笔记】iOS-GCD-使用方法
  • 原文地址:https://www.cnblogs.com/yzryc/p/6374935.html
Copyright © 2011-2022 走看看