为什么COM方法调用返回RPC_S_INTERNAL_ERROR?

时间:2012-03-01 16:47:29

标签: c# .net com interop

我有一个用C ++编程的COM类。 它是由一位在这里工作时间较长的同事制作的。

这是IDL文件中的一行:

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

当我在C#.Net项目中添加对C ++ DLL的引用时,它的翻译如下:

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);

有类似的结果。

我收到0x800706e6异常,意味着RPC_S_INTERNAL_ERROR。 我认为问题在于LPOLESTR / StringBuilder,因为我有几个类似的项目,字符串为BSTR *而不是LPOLESTR,一切正常(它们被转换为" out String"而不是" StringBuilder& #34;。)

在VB6中有一个带有DLL写入的示例应用程序,并且以这种方式调用该方法:

Dim s as MyStruct
Dim str as String * 255
Dim c as new MyComClass()
c.MyMethod(str, s)

eveything工作正常。

对于发生了什么有什么想法?

1 个答案:

答案 0 :(得分:0)

我仍然不知道问题是什么,但我找到了一个解决方案,更改了IDL文件

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

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