1
私はCOMクラスをC++でプログラミングしています。 ここで働いていない同僚が作ったものです。COMメソッド呼び出しがRPC_S_INTERNAL_ERRORを返すのはなぜですか?
これは、IDLファイルから1行です:私はC#.NETプロジェクトにC++ DLLへの参照を追加すると、以下のように
HRESULT MyMethod([out, size_is(255)] LPOLESTR arg1, [in, out] MyStruct* arg2);
、それが翻訳されます:
void MyMethod([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder arg1, [In, Out] ref MyStruct arg2);
私のテスト次のようにコードは次のとおりです。
StringBuilder sb = new StringBuilder();
MyStruct s = new MyStruct();
MyCOMClass c = new MyComClass();
c.MyMethod(sb, ref s);
私も
をやって試してみましたStringBuilder sb = new StringBuilder(255);
同様の結果です。
RPC_S_INTERNAL_ERRORを意味する0x800706e6例外が発生しています。 問題はLPOLESTR/StringBuilderにあると思います。なぜなら、LPOLESTRの代わりにBSTR *という文字列を持つ類似のプロジェクトがいくつかあり、すべて正常に動作するからです( "StringBuilder"ではなく "Out String"に変換されます)。
ありVB6でwriteen DLLのサンプルアプリです、そしてこの方法は、このように呼ばれている:
Dim s as MyStruct
Dim str as String * 255
Dim c as new MyComClass()
c.MyMethod(str, s)
そしてeveythingが正常に動作します。
何が起こっているか考えてみましょうか?