ActiveX DLLの作り方
ActiveX DLLプロジェクトを作成するには
メソッドを追加するには
プロパティを追加するには
最後に「実行」-「ActiveXサーバの登録」を行うと、ActiveX EXEが作成されてレジストリに登録されます。他のマシンに登録するときは、regsvr32.exeによって行います。
ActiveX DLLの例
この例はParamプロパティに実数を与えるとAnsプロパティに平方根を返す単純なものです。
{ unitRootOf.pas }
unit unitRootOf; interface uses ComObj, ActiveX, projRootOf_TLB; type TTRootOf = class(TAutoObject, ITRootOf) protected function Get_ans: Double; safecall; function Get_param: Double; safecall; procedure Set_param(Value: Double); safecall; function Get_Error: Integer; safecall; private FParam: Double; FAns: Double; FError: Integer; end; implementation uses ComServ; function TTRootOf.Get_ans: Double; begin Result := FAns; end; function TTRootOf.Get_param: Double; begin Result := FParam; end; procedure TTRootOf.Set_param(Value: Double); begin FParam := Value; if FParam >= 0 then begin FAns := Sqrt(FParam); FError := 0 end else begin FAns := 0; FError := -1 end; end; function TTRootOf.Get_Error: Integer; begin Result := FError; end; initialization TAutoObjectFactory.Create(ComServer, TTRootOf, Class_TRootOf, ciMultiInstance); end.
{ projRootOf_TLB.pas } unit projRootOf_TLB; { このファイルにはタイプライブラリから作成した PASCAL による宣言が収められ ています。タイプライブラリエディタで更新をおこなうと内容が書き換えられます。 このファイルを直接変更しても、タイプライブラリエディタによって上書きされる ため変更内容は保存されません。 } { projRootOf Library } { Version 1.0 } interface uses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL; const LIBID_projRootOf: TGUID = '{EB695580-8464-11D1-B2EE-B5F44D0AA776}'; const { コンポーネント クラスの GUID } Class_TRootOf: TGUID = '{EB695582-8464-11D1-B2EE-B5F44D0AA776}'; type { Interfaces の前方参照宣言 } ITRootOf = interface; ITRootOfDisp = dispinterface; { CoClasses の前方参照宣言 } TRootOf = ITRootOf; { TRootOf Object (オブジェクト) のディスパッチ インターフェース } ITRootOf = interface(IDispatch) ['{EB695581-8464-11D1-B2EE-B5F44D0AA776}'] function Get_param: Double; safecall; procedure Set_param(Value: Double); safecall; function Get_ans: Double; safecall; function Get_Error: Integer; safecall; property param: Double read Get_param write Set_param; property ans: Double read Get_ans; property Error: Integer read Get_Error; end; { ITRootOf デュアルインターフェースの DispInterface 宣言 } ITRootOfDisp = dispinterface ['{EB695581-8464-11D1-B2EE-B5F44D0AA776}'] property param: Double dispid 1; property ans: Double readonly dispid 2; property Error: Integer readonly dispid 3; end; { TRootOfObject (オブジェクト) } CoTRootOf = class class function Create: ITRootOf; class function CreateRemote(const MachineName: string): ITRootOf; end; implementation uses ComObj; class function CoTRootOf.Create: ITRootOf; begin Result := CreateComObject(Class_TRootOf) as ITRootOf; end; class function CoTRootOf.CreateRemote(const MachineName: string): ITRootOf; begin Result := CreateRemoteComObject(MachineName, Class_TRootOf) as ITRootOf; end; end.
{ projRootOf.dpr } library projRootOf; uses ComServ, projRootOf_TLB in 'projRootOf_TLB.pas', unitRootOf in 'unitRootOf.pas' {TRootOf: CoClass}; exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.TLB} {$R *.RES} begin end.