タイプライブラリとCOMオブジェクトの使い方
タイプライブラリを取りこむと、COMオブジェクトのPascalラッパーユニットが作られますが、その使い方は非常に簡単です。リスト-1にラッパーユニットの例を示します。このCOMオブジェクトは、座標を表すCood型データを設定するのと読み出すだけのメソッドを持つ単純なCOMオブジェクト(ActiveX DLL)です。
リスト-1の最後のほうに"class function CoPosClass.Create: IPosClass;"がありますが、これを呼び出すことによりオブジェクトが作成できます。オブジェクトの型は、"PosClass = IPosClass"で定義されます。"IPosCalss"はタイプライブラリで定義されたインターフェースです。このCOMオブジェクトの使用例をリスト-2に示します。
リスト-1
unit DllSvr3_TLB;
// ************************************************************************ //
// 警告 //
// ------- //
// このファイルで定義されている型宣言はタイプライブラリから読み出した //
// 値を元に作成されています。タイプライブラリエディタで作業中に [ソー //
// スコードの更新] ボタンを押したときや,ほかのタイプライブラリが直接 //
// または間接にこのタイプライブラリを参照している場合に,このファイル //
// はタイプライブラリの値を元に再生成されます。 //
// この場合,このファイル自身に対する変更は失われてしまいます。 //
// ************************************************************************ //
// PASTLWTR : $Revision: 1.11.1.63.1.0.1.0 $
// このファイルは以下のタイプライブラリから 98/10/27 22:05:02 に生成されました。
// ************************************************************************ //
// Type Lib: F:\Develop\Delphi4\ActiveX\DllSvr3\DllSvr3.tlb
// IID\LCID: {76A188E7-6DE2-11D2-837B-004026181405}\0
// Helpfile:
// HelpString: DllSvr3 ライブラリ
// Version: 1.0
// ************************************************************************ //
interface
uses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL;
// *********************************************************************//
// タイプライブラリに含まれる GUID の定義。 //
// 接頭文字列は以下の意味を持ちます。 //
// Type Libraries : LIBID_xxxx //
// CoClasses : CLASS_xxxx //
// DISPInterfaces : DIID_xxxx //
// 非 DISP interfaces : IID_xxxx //
// *********************************************************************//
const
LIBID_DllSvr3: TGUID = '{76A188E7-6DE2-11D2-837B-004026181405}';
IID_IPosClass: TGUID = '{76A188E8-6DE2-11D2-837B-004026181405}';
CLASS_PosClass: TGUID = '{76A188EA-6DE2-11D2-837B-004026181405}';
type
// *********************************************************************//
// タイプライブラリ中のインターフェーに対する前方参照宣言 //
// *********************************************************************//
IPosClass = interface;
// *********************************************************************//
// このタイプライブラリのもつ CoClasses 定義の宣言 //
// ここでは,CoClass をそれのデフォルトインターフェースに割り当てます。 //
// *********************************************************************//
PosClass = IPosClass;
// *********************************************************************//
// structure,union および alias の定義 //
// *********************************************************************//
Coord = packed record
X: Single;
Y: Single;
end;
// *********************************************************************//
// Interface: IPosClass
// Flags: (0)
// GUID: {76A188E8-6DE2-11D2-837B-004026181405}
// *********************************************************************//
IPosClass = interface(IUnknown)
['{76A188E8-6DE2-11D2-837B-004026181405}']
procedure SetPos(p: Coord); stdcall;
procedure GetPos(out p: Coord); stdcall;
end;
CoPosClass = class
class function Create: IPosClass;
class function CreateRemote(const MachineName: string): IPosClass;
end;
implementation
uses ComObj;
class function CoPosClass.Create: IPosClass;
begin
Result := CreateComObject(CLASS_PosClass) as IPosClass;
end;
class function CoPosClass.CreateRemote(const MachineName: string): IPosClass;
begin
Result := CreateRemoteComObject(MachineName, CLASS_PosClass) as IPosClass;
end;
end.
リスト-2
var
obj: PosClass; // オブジェクトの宣言
procedure TForm1.FormCreate(Sender: TObject);
begin
obj := CoPosClass.Create; // 作成
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
obj := nil;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
p: Coord;
begin
p.X := StrToFloat(Edit1.Text);
p.Y := StrToFloat(Edit2.Text);
obj.SetPos(p); // メソッドの使用
end;
procedure TForm1.Button2Click(Sender: TObject);
var
p: Coord;
s: string;
begin
obj.GetPos(p); // メソッドの使用
s := '(' + FloatToStr(p.X) + ' ,';
s := s + FloatToStr(p.Y) + ')';
Label2.Caption := s;
end;