国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

如何使程序在運(yùn)行時(shí)自動(dòng)注冊ActiveX控件

2019-11-18 18:29:50
字體:
供稿:網(wǎng)友
          編寫Delphi應(yīng)用程序時(shí),經(jīng)常會(huì)遇到一些ActiveX控件[注:擴(kuò)展名為OCX的控件或DLL的類型庫],它們?yōu)閼?yīng)用程序的開發(fā)提供了簡單的操作途徑。然而,這些程序在發(fā)布的同時(shí),面臨ActiveX控件注冊問題。解決途徑:一、用安裝程序制作打包文件,往往會(huì)給增加程序本身的大小,系統(tǒng)重裝時(shí),則必須重新安裝它;二、用程序本身進(jìn)行代碼編寫函數(shù)的形式處理它。
使用方法分為兩種:
一、直接把可視化的ActiveX控件放到程序中;
二、運(yùn)行時(shí)根據(jù)需要實(shí)時(shí)建立。
如果是直接使用,則應(yīng)用程序在初始化的過程中會(huì)自動(dòng)尋找、創(chuàng)建所需的ActiveX控件,如果控件沒有注冊,初始化程序會(huì)產(chǎn)生一個(gè)異常,捕捉并處理這個(gè)異常。
在程序Form中加入一個(gè)新的方法:
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}

{-------------------------------------------------
標(biāo)準(zhǔn)ActiveX控件中,有兩個(gè)函數(shù)DLLRegisterServer 、DLLUnRegisterServer可調(diào)用,
其中函數(shù)用于注冊控件,用于卸載控件。我們可用LoadLibrary裝載DLL/OCX文件,用
GetProcAddress獲取DLLRegisterServer和DLLUnRegisterServer兩個(gè)函數(shù)的指針,然
后再直接運(yùn)行這兩個(gè)函數(shù)即可實(shí)現(xiàn)注冊和卸載ActiveX控件的操作,從而代替Windows
系統(tǒng)的RegSvr32.exe實(shí)現(xiàn)ActiveX控件的注冊和卸載。
--------------------------------------------------}
{-------------------------------------------------
參數(shù)說明:
sOleFileName 一個(gè)DLL或OCX文件名;
OleAction 表示注冊操作類型:1表示注冊,0表示卸載
返回值:True表示操作執(zhí)行成功,F(xiàn)alse表示操作執(zhí)行失敗
--------------------------------------------------}
function OLERegister(sOleFileName: String; OleAction: Byte):Boolean;
const
  RegisterOle = 1; //注冊
  UnRegisterOle = 0; //卸載
type
  TOleRegisterFunction = function: HResult; //注冊或卸載函數(shù)原型
var
  hLibraryHandle: THandle; //由LoadLibray返回的DLL或OCX句柄
  hFunctionAddress: TFarProc; //DLL或OCX中的函數(shù)句柄,由GetProAddress返回
  RegFunction: TOleRegisterFunction; //注冊或卸載函數(shù)指針
begin
  Result := False;
  //打開文件,返回DLL或OCX句柄
  hLibraryhandle := LoadLibrary(PChar(SOleFileName));
  if (hLibraryHandle > 0) then //DLLakg OCX句柄正確
  try
    //返回注冊或卸載函數(shù)指針
    if (OleAction = RegisterOle) then  //返回注冊函數(shù)指針
      hFunctionAddress := GetProcAddress(hLibraryhandle,PChar('DLLRegisterServer'))
    else //返回卸載函數(shù)指針
      hFunctionAddress := GetProcAddress(hLibraryhandle,PChar('DLLUnRegisterServer'));
    if (hFunctionAddress <> nil) then //判斷注冊或卸載函數(shù)是否存在
    begin
      RegFunction := TOleRegisterFunction(hFunctionAddress); //獲取操作函數(shù)的指針
      if RegFunction >=0 then  //執(zhí)行注冊或卸載操作,返回值>=0表示執(zhí)行成功
        Result := True;
    end;
  finally
    FreeLibrary(hLibraryHandle); //關(guān)閉已打開的文件
  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方法賦值給系統(tǒng)Application變量,在主Form的OnCreate事件中。
procedure TAutoRegActiveXFrm.FormCreate(Sender: TObject);
var
  DemoOcx: Variant; //變量聲明
begin
  Application.OnException := CheckException;
  //是否產(chǎn)生類名稱字符串錯(cuò)誤
  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('控件注冊失敗,程序?qū)o法正常運(yùn)行',PChar('注冊控件'),MB_OK+MB_ICONERROR);
        Application.Terminate;
      end;
    end;
  end;
end;

end.


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

下一篇:動(dòng)態(tài)創(chuàng)建ClientDataSet的表定義

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 托克逊县| 乐平市| 理塘县| 定兴县| 开平市| 滦南县| 宝山区| 茂名市| 镇远县| 连山| 泾源县| 凤庆县| 都安| 宣化县| 桃江县| 南平市| 滦南县| 新民市| 鄂托克前旗| 故城县| 宜兴市| 张家港市| 邵东县| 新郑市| 斗六市| 锦州市| 黑河市| 嘉鱼县| 苏尼特左旗| 威宁| 广南县| 普兰店市| 宁夏| 鄱阳县| 读书| 四平市| 河源市| 克拉玛依市| 宁波市| 侯马市| 漠河县|