2012-03-01 4 views
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が正常に動作します。

何が起こっているか考えてみましょうか?

答えて

0

私はまだ問題があるのか​​分からないが、私は

HRESULT MyMethod([out, size_is(255)] LPOLESTR arg1, [in, out] MyStruct* arg2); 

HRESULT MyMethod([in, out] LPOLESTR arg1, [in, out] MyStruct* arg2); 

にIDLファイルに変更して、解決策を見つけました
関連する問題