2015-01-21 3 views
0

Я вызываю метод C# из функции C++.Возвращает строку из метода C# функции C++ в аргументе вывода

метод

C# необходимо сделать следующее:

  • Выделяет BSTR и вернуть его в функцию C++ в выходном аргументе
  • возвращающих HRESULT функции C++ через стек (по возвращаемому значению)

я реализовал метод C# следующим образом:

int Method(out IntPtr output) 
{ 
    int status = 0; 
    ... 
    output = Marshal.StringToBSTR(someString); 
    ... 
    return status; 
} 

Вопросы:

  • Какой вариант типа я должен использовать в C++, который соответствует out IntPtr типа в C#?
  • Есть ли какой-нибудь другой тип в C#, который я должен использовать вместо этого, чтобы вернуть BSTR?
  • Если да, то какой тип C# это, и что представляет собой соответствующий тип C++-типа?

Я пробовал несколько типов вариантов, перечисленных here, но ни один из них не работал.

+0

Является ли код C++ C# DLL в качестве COM-компонента? или вы пишете C++/CLI? – Matt

+0

@Matt: первый вариант. –

ответ

0

Вы используете COM Callable Wrapper, для ваших вопросов:

  1. C# out IntPtr отображается void** в COM data types.

  2. По умолчанию, типа # строки C маршалируются как тип BSTR в COM, пожалуйста, проверьте Default Marshaling for Strings, так что вы можете просто использовать строку в C#

  3. Тип варианта для BSTR является VT_BSTR, но если вы только имея дело со строками, вы можете просто BSTR, вам не нужно использовать варианты типов.
+0

Но я не передаю 'BSTR' методу C#. Я передаю «BSTR *», в который метод C# должен записать адрес недавно выделенного «BSTR». Поэтому я не могу использовать 'VT_BSTR' для этой цели. –

+0

, но вы передаете Intptr, он становится недействительным **. – Matt

+0

На стороне C# я ожидаю «out IntPtr» (если у вас нет лучшего предложения). Что «VT» следует использовать на стороне C++ при вызове этого метода? –