Получить значение параметра C # out string в C BSTR *?

#c #casting #unmanaged #managed #firebreath

#c #Кастинг #неуправляемый #управляемый #дыхание огня

Вопрос:

У меня есть метод в C # DLL, имеющий один входной и два выходных параметра. Все три являются строковыми.

Я хочу вызвать эту функцию из firebreath C . Как мне передать значение BSTR * из C ?. И как мне получить эти значения из C #?

Я уже пытался использовать

 BSTR* userKey =NULL;
*userKey = ::SysAllocString(L"Hello Managed World");
  

Но это не работает.

Функция C #:

 public void GetPublicKeyforEncryption(String ToUserEmailAddress, out String userKey , out String mySharedKey)
  

Вызывающая функция C :

 std::wstringamp; ToUserEmailaddress;
BYTE **bEncryptData = NULL;
BSTR bsData = SysAllocStringLen(ToUserEmailaddress.data(), ToUserEmailaddress.size());
BSTR* userKey =NULL;
BSTR* mySharedKey =NULL;
CSharpInterface->GetPublicKeyforEncryption(bsData,userKey ,mySharedKey );
  

В приведенном выше c GetPublicKeyforEncryption значение bsData передается правильно, как я буду выделять память и передавать

    userKey ,mySharedKey in the BSTR* type
  

Кто-нибудь может решить эту проблему?
Помогите мне.

Спасибо Sanju

Ответ №1:

Это неправильный код, BSTR уже является типом указателя. Вам нужно передать указатель на вашу переменную BSTR, чтобы вызываемый метод мог ее назначить. Общий код, который принимает только один out string аргумент:

 BSTR retval = NULL;
HRESULT hr = CSharpInterface->SomeMethod(amp;retval);
if (SUCCEEDED(hr)) {
    // Use retval
    //...
    SysFreeString(retval);
}
  

Комментарии:

1. Спасибо за ваш ответ, Ханс Пассант.я уже пробовал это. выдает ошибку C2664: ‘std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> amp;)’ : не удается преобразовать параметр 1 из ‘OLECHAR’ в ‘const std::basic_string<_Elem,_Traits,_Ax> amp;’

2. Мой фрагмент кода не использует std::string, поэтому не может сгенерировать эту ошибку компиляции. Преобразование из BSTR в std::wstring требует приведения к wchar_t *, чтобы сообщить компилятору, что вы знаете, что это может привести к потере данных.