質問

_tlb.pasファイルのこのインターフェイス

// *********************************************************************//
// Interface: ITMyCOM
// Flags: (256) OleAutomation
// GUID: {D94769D0-F4AF-41E9-9111-4D8BC2F42D69}
// *********************************************************************//
ITMyCOM = interface(IUnknown)
['{D94769D0-F4AF-41E9-9111-4D8BC2F42D69}']
function MyDrawWS(a: Integer; b: Integer): WideString; stdcall;
end;

これはOSウィンドウを見ます

[
odl,
uuid(D94769D0-F4AF-41E9-9111-4D8BC2F42D69),
version(1.0),
helpstring("Interface for TMyCOM Object"),
oleautomation
]
interface ITMyCOM : IUnknown {
BSTR _stdcall MyDrawWS(
[in] long a, 
[in] long b);
};

COMサーバーの関数はそうです

function TTMyCOM.MyDrawWS(a, b: Integer): WideString;
begin
Result := WideString(IntToStr(a+b));
end;

comクライアントでは、この関数を次のように呼びます

Edit1.Text := String(MyCOM.MyDrawWS(1,1));

エラーを取得します $ 75A9FBAEでの最初のチャンス例外。 Module 'rpcrt4.dllのアドレス75A409A4でのメッセージ「アクセス違反」を使用した例外クラスeaccessviolation。アドレスFFFFFFF8 'を読んでください。プロセスproject1.exe(2296)

整数を返したい場合は、機能します。 WideStringを返す方法は?

役に立ちましたか?

解決

これを処理する正しい方法は次のとおりです。

[ 
odl, 
uuid(D94769D0-F4AF-41E9-9111-4D8BC2F42D69), 
version(1.0), 
helpstring("Interface for TMyCOM Object"), 
oleautomation 
] 
interface ITMyCOM : IUnknown { 
HRESULT _stdcall MyDrawWS( 
[in] long a,  
[in] long b,
[out, retval] BSTR* ret); 
}; 

ITMyCOM = interface(IUnknown) 
  ['{D94769D0-F4AF-41E9-9111-4D8BC2F42D69}'] 
  function MyDrawWS(a: Integer; b: Integer; out ret: WideString): HResult; stdcall; 
end; 

function TTMyCOM.MyDrawWS(a, b: Integer; out ret: WideString): HRESULT; 
begin 
  ret := IntToStr(a+b);
  Result := S_OK;
end; 

var
  W: WideString;
begin
  OleCheck(MyCOM.MyDrawWS(1, 1, W));
  Edit1.Text := W;
end;

Delphiの使用によって少し単純化することができます safecall インターフェイスのDelphi宣言(タイプ構造自体ではない)での慣習を呼び出します。

ITMyCOM = interface(IUnknown) 
  ['{D94769D0-F4AF-41E9-9111-4D8BC2F42D69}'] 
  function MyDrawWS(a: Integer; b: Integer): WideString; safecall;
end; 

function TTMyCOM.MyDrawWS(a, b: Integer): WideString;
begin 
  Result := IntToStr(a+b);
end; 

Edit1.Text := MyCOM.MyDrawWS(1, 1);

他のヒント

hresult以外の返品値を使用しないでください。代わりに、出力パラメーターとしてパラメーターリストに戻り値を配置します。

function MyDrawWS(a: Integer; b: Integer; out str : WideString): HRESULT; stdcall;

このようにして、comメモリマネージャーのimalloc(pur comのcotaskmemalloc、sysallocstring for automation)も使用することを余儀なくされます。

Delphiにコンバージョンを自動的に実行させます。キャストしないでください。メモリレイアウトが互換性があるため、(ANSI)文字列をPCHAにキャストできますが、幅が広いまたはその逆に文字列をキャストすることはできません。 Delphiは、一方を他方に割り当てると、変換を完了します。

Delphi <2009で

var
S: string;
W: WideString;
...
S := W;  // Conversion, WideString -> AnsiString;
W := S; // Conversion, AnsiString -> WideString

使用する必要があります SysAllocString() また SysAllocStringLen() BSTRを割り当てるには。

$ 75A9FBAEでの最初のチャンス例外。モジュールのアドレス75A409A4でのメッセージ「アクセス違反」というメッセージ付きの例外クラスeaccessviolation 'rpcrt4.dll'

  1. エラーはRPCRT4.DLLから発生しています

  2. eaccessviolationは主にnullオブジェクトにアクセスすることによって引き起こされます。コードをステップスルーして、すべてのオブジェクトが有効なオブジェクトであることを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top