麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

如何使程序在運行時自動注冊ActiveX控件

2019-11-18 18:29:50
字體:
來源:轉載
供稿:網友
          編寫Delphi應用程序時,經常會遇到一些ActiveX控件[注:擴展名為OCX的控件或DLL的類型庫],它們為應用程序的開發提供了簡單的操作途徑。然而,這些程序在發布的同時,面臨ActiveX控件注冊問題。解決途徑:一、用安裝程序制作打包文件,往往會給增加程序本身的大小,系統重裝時,則必須重新安裝它;二、用程序本身進行代碼編寫函數的形式處理它。
使用方法分為兩種:
一、直接把可視化的ActiveX控件放到程序中;
二、運行時根據需要實時建立。
如果是直接使用,則應用程序在初始化的過程中會自動尋找、創建所需的ActiveX控件,如果控件沒有注冊,初始化程序會產生一個異常,捕捉并處理這個異常。
在程序Form中加入一個新的方法:
unit UAutoRegActiveX;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj; //加入ComObj單元

type
  TAutoRegActiveXFrm = class(TForm)
    PRocedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  protected
    { Public declarations }
    procedure CheckException(Sender: TObject; EAbort: Exception);
  end;

var
  AutoRegActiveXFrm: TAutoRegActiveXFrm;

implementation

{$R *.dfm}

{-------------------------------------------------
標準ActiveX控件中,有兩個函數DLLRegisterServer 、DLLUnRegisterServer可調用,
其中函數用于注冊控件,用于卸載控件。我們可用LoadLibrary裝載DLL/OCX文件,用
GetProcAddress獲取DLLRegisterServer和DLLUnRegisterServer兩個函數的指針,然
后再直接運行這兩個函數即可實現注冊和卸載ActiveX控件的操作,從而代替Windows
系統的RegSvr32.exe實現ActiveX控件的注冊和卸載。
--------------------------------------------------}
{-------------------------------------------------
參數說明:
sOleFileName 一個DLL或OCX文件名;
OleAction 表示注冊操作類型:1表示注冊,0表示卸載
返回值:True表示操作執行成功,False表示操作執行失敗
--------------------------------------------------}
function OLERegister(sOleFileName: String; OleAction: Byte):Boolean;
const
  RegisterOle = 1; //注冊
  UnRegisterOle = 0; //卸載
type
  TOleRegisterFunction = function: HResult; //注冊或卸載函數原型
var
  hLibraryHandle: THandle; //由LoadLibray返回的DLL或OCX句柄
  hFunctionAddress: TFarProc; //DLL或OCX中的函數句柄,由GetProAddress返回
  RegFunction: TOleRegisterFunction; //注冊或卸載函數指針
begin
  Result := False;
  //打開文件,返回DLL或OCX句柄
  hLibraryhandle := LoadLibrary(PChar(SOleFileName));
  if (hLibraryHandle > 0) then //DLLakg 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); //關閉已打開的文件
  end;
end;

{ TAutoRegActiveXFrm }

procedure TAutoRegActiveXFrm.CheckException(Sender: TObject;
  EAbort: Exception);
begin
  if EAbort is EOleSysError then
  begin
    if HResult(EOleSysError(EAbort).ErrorCode) = REGDB_E_CLASSNOTREG then
      OleRegister('D:/Flash.ocx',1);
  end
  else
    application.ShowException(EAbort);
end;
//將CheckException方法賦值給系統Application變量,在主Form的OnCreate事件中。
procedure TAutoRegActiveXFrm.FormCreate(Sender: TObject);
var
  DemoOcx: Variant; //變量聲明
begin
  Application.OnException := CheckException;
  //是否產生類名稱字符串錯誤
  try
    DemoOcx := CreateOleObject('Demo.Demo');
  except
    on EAbort:EOleSysError do
    if HResult(EAbort.ErrorCode) = CO_E_CLASSSTRING then
    begin
      if OleRegister('D:/Flash.ocx',1) then
        DemoOcx := CreateOleObject('Demo.Demo')
      else
      begin
        Application.MessageBox('控件注冊失敗,程序將無法正常運行',PChar('注冊控件'),MB_OK+MB_ICONERROR);
        Application.Terminate;
      end;
    end;
  end;
end;

end.


上一篇:QQ尾巴病毒的發送原理分析

下一篇:動態創建ClientDataSet的表定義

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 日本一级黄色毛片 | 久久国产精品二国产精品中国洋人 | 91在线视频导航 | 欧美三级日本三级少妇99 | 在线观看一区二区三区四区 | xxx日本视频 | 欧美毛片 | 国产精品刺激对白麻豆99 | 久久精品亚洲欧美日韩精品中文字幕 | 久久亚洲国产精品 | 黄视频免费在线观看 | 久久亚洲精品11p | 欧美 中文字幕 | 嫩草91在线 | 午夜视频在线免费播放 | 韩国精品视频在线观看 | 国产乱弄| 久久第四色 | 国产 一区 | 日本最新免费二区三区 | 国产成人在线免费视频 | 国产999在线 | 久久久久久久久久网站 | 成人在线观看一区二区三区 | 深夜小视频在线观看 | 91av99 | 一级电影免费在线观看 | 国产精选电影免费在线观看网站 | 中国黄色一级生活片 | h色视频在线观看 | 爱射av| 深夜免费视频 | 狠狠干夜夜草 | 草莓福利视频在线观看 | 最新午夜综合福利视频 | 91久久夜色精品国产网站 | 91短视频版高清在线观看免费 | 欧美日韩国产一区二区三区在线观看 | 欧美黄色片免费看 | 国产1区视频 | 亚洲国产精品久久久久久久久久 |