Почему вызов метода COM возвращает RPC_S_INTERNAL_ERROR? - PullRequest
1 голос
/ 01 марта 2012

У меня есть COM-класс, запрограммированный на C ++. Это было сделано коллегой, который больше не работает здесь.

Это одна строка из файла IDL:

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

Когда я добавляю ссылку на C ++ DLL в проект C # .Net, она переводится следующим образом:

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»).

Существует пример приложения с DLL, написанной на VB6, и метод вызывается следующим образом:

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

И все работает нормально.

Есть идеи о том, что происходит?

1 Ответ

0 голосов
/ 02 марта 2012

Я до сих пор не знаю, в чем проблема, но я нашел решение, изменив в файле IDL

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

на

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