为什么COM方法调用返回RPC_S_INTERNAL_ERROR

本文关键字:INTERNAL ERROR RPC 返回 COM 方法 调用 为什么 | 更新日期: 2023-09-27 18:26:12

我有一个用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")。

有一个在VB6中写入DLL的示例应用程序,该方法是这样调用的:

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

一切都很好。

知道发生了什么事吗?

为什么COM方法调用返回RPC_S_INTERNAL_ERROR

我仍然不知道问题出在哪里,但我已经找到了解决方案,在IDL文件中进行了更改

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

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