delphi.gif (306 バイト) ActiveX EXEの作り方


ActiveX EXEはアウトオブプロセスサーバとも言われ、それ自体実行可能なオートメーションサーバです。

 

toach.gif (917 バイト) ActiveX EXEの作り方

  1. 通常のアプリケーションプロジェクトを作成します。
  2. 「ファイル/新規作成」を実行して現れるダイアログボックスでActiveXタブを選択します。
  3. 「オートメーションオブジェクト」を選択してOKボタンを押します。
  4. 「オートメーションオブジェクトウィンザード」が表示されるので、オートメーションクラス名を入力します。
  5. また、必要なら「インスタンス生成」を変更します。
  6. OKボタンを押すとタイプライブラリエディタが表示されるので、プロジェクト名やヘルプ文字列を適切なものに変更します。
  7. 左側のペインでインターフェース(前に入力したオートメーションクラス名の先頭にIを付けた項目)を選択します。
  8. PropertyまたはMethodボタンを押してインターフェースにプロパティやメソッドを追加します。
  9. 追加したら、その適切なものに名称を変更し、右側のペインで型やパラメータを変更または追加します。
  10. 最後に「更新」ボタンを押すと、インターフェースがコードに反映されます。
  11. タイプライブラリエディタを閉じて、プロパティやメソッドの具体的動作をエディタで記述します。
  12. 完成したら、実行させるとレジストリにそのActiveX EXEが登録されます。

 

delphi1.gif (322 バイト)

つぎの例は、Property1,Method1,Method2を持つ単純なActiveX EXEの例です。Property1は内部のメンバ変数の値を読み書きします。Method1は内部メンバ変数にパラメータを加えます。Method2は内部メンバ変数を0にします。

unit Unit2;

interface

uses
  ComObj, ActiveX, Class1_TLB;

type
  TClass1 = class(TAutoObject, IClass1)
  protected
    function Get_Property1: Integer; safecall;
    procedure Set_Property1(Value: Integer); safecall;
    procedure Method1(Value: Integer); safecall;
    procedure Method2; safecall;
  private
    FData: Integer;
  end;

implementation

uses ComServ;

function TClass1.Get_Property1: Integer;
begin
    Result := FData;
end;

procedure TClass1.Set_Property1(Value: Integer);
begin
    FData := Value;
end;

procedure TClass1.Method1(Value: Integer);
begin
    FData := FData + Value;
end;

procedure TClass1.Method2;
begin
    FData := 0;
end;

initialization
  TAutoObjectFactory.Create(ComServer, TClass1, Class_Class1, ciSingleInstance);
end.

delphi1.gif (322 バイト) 使用例

unit Test1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    cmdSet: TButton;
    cmdGet: TButton;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure cmdSetClick(Sender: TObject);
    procedure cmdGetClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    obj: Variant;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
    obj := CreateOleObject('Class1.Class1');
end;

procedure TForm1.cmdSetClick(Sender: TObject);
begin
    obj.Property1 := StrToInt(Edit1.Text);
end;

procedure TForm1.cmdGetClick(Sender: TObject);
begin
    Label1.Caption := IntToStr(obj.Property1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    n: Integer;
begin
    n := StrToInt(Edit1.Text);
    obj.Method1(n);
    Label1.Caption := IntToStr(obj.Property1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    obj.Method2;
    Label1.Caption := IntToStr(obj.Property1);
end;

end.