インターフェイスに関する Delphi のタイプ セーフは、一意の (オプションですが、入力されている場合は一意の) GUID を設定することで維持されると考えていました。
次に、その質問がありました: OLE経由で Word CentimetersToPoints を呼び出すと、不明なエラーが発生します
。
そして、在庫の DelphiTWordApplication
コンポーネント (つまり、Word200.pas
ユニット) を探し始めました。そして、私が見る:
// *********************************************************************//
// Interface: _Application
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {00020970-0000-0000-C000-000000000046}
// *********************************************************************//
_Application = interface(IDispatch)
['{00020970-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; safecall;
// *********************************************************************//
// DispIntf: _ApplicationDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {00020970-0000-0000-C000-000000000046}
// *********************************************************************//
_ApplicationDisp = dispinterface
['{00020970-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; dispid 371;
または類似:
// *********************************************************************//
// Interface: _Global
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {000209B9-0000-0000-C000-000000000046}
// *********************************************************************//
_Global = interface(IDispatch)
['{000209B9-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; safecall;
// *********************************************************************//
// DispIntf: _GlobalDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {000209B9-0000-0000-C000-000000000046}
// *********************************************************************//
_GlobalDisp = dispinterface
['{000209B9-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; dispid 371;
そして、私はここで完全に迷っています。
私はそれが好きなのdispinterface
「サブクラス」だと思っていましたか?はいの場合、同じプロジェクトで同じ GUID を持つ 2 つのインターフェイスをどのように設定できますか?interface
TPersistent
TObject
それとも、Delphi の新しいclass
型から継承された TurboPascalobject
の型など、関連のない別のフレームワークからのものですか? どちら_GlobalDisp
も_ApplicationDisp
使用されていないように見えるWord200.pas
ので、付録のように、自動インポートされますが、実際には使用されませんか?
_Application
と の両方を使用してプロジェクトを作成し、_ApplicationDisp
コンパイルします。しかし、同じGUIDを持っている場合、Delphiはどのようにそれをタイプキャストするのだろうか?
procedure TForm4.Button1Click(Sender: TObject);
procedure show(const s: Single);
begin
ShowMessage(FloatToStr(s));
end;
begin
show( WordApplication1.CentimetersToPoints(1.0) );
show( WordApplication1.Application.CentimetersToPoints(2.0) );
show( WordApplication1.DefaultInterface.CentimetersToPoints(3.0) );
show( _ApplicationDisp(WordApplication1.Application).CentimetersToPoints(4.0) );
show( (WordApplication1.DefaultInterface as _ApplicationDisp).CentimetersToPoints(5.0) );
end;