2012-03-01 52 views
1

我有一个用C++编写的COM类。这是由一位不再在这里工作的同事制作的。为什么COM方法调用返回RPC_S_INTERNAL_ERROR?

这是从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 writeen DLL中的示例应用程序,并调用该方法以这种方式:

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

而且eveything工作正常。

想知道发生了什么?

回答

0

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

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

HRESULT MyMethod([in, out] LPOLESTR arg1, [in, out] MyStruct* arg2); 
相关问题