Выходной строковый параметр не возвращается из COM-взаимодействия - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть метод компонента ATL COM с параметром [out] BSTR *. Я создал ссылку на этот компонент из моего приложения .NET, которое рассматривает параметр как выходной тип String. COM-компонент выделяет эту строку следующим образом:

    USES_CONVERSION;
    *sText = SysAllocString(T2OLE(psText));

где psText - символ *

Однако, когда возвращается метод, код .NET по-прежнему содержит пустую строку. Кто-нибудь может увидеть, что не так?

Ответы [ 3 ]

1 голос
/ 01 октября 2011

Код не неправильный, но среда выполнения .Net может быть слишком глупой, чтобы разобрать косвенность.Возможно, вы захотите перефразировать ваш IDL из:

HRESULT DoSomething([in] BSTR arg, [out] BSTR *result);

в:

HRESULT DoSomething([in] BSTR arg, [out, retval] BSTR *result);

Первый синтаксис даст в C #:

string result;
void DoSomething(string arg, out result);

2nd:

string result = DoSomething(arg);

Любое преобразование Unicode из 8-битного в 16-битное должно проходить через SysAllocString, поскольку как out, так и out, retval требуют, чтобы вызывающая сторона освободила строку.Тем не менее, .Net-runtime может получить лучшие результаты, если будет сказано, что это возвращаемое значение;

0 голосов
/ 30 сентября 2011

У вас не возникнет проблем CHAR / WCHAR, если вы замените

*sText = SysAllocString(T2OLE(psText));

на

*sText = CComBSTR(psText).Detach();

. Конструктор CComBSTR автоматически применяет преобразование.

0 голосов
/ 30 сентября 2011

Если ваш компонент ATL COM скомпилирован с флагом UNICODE, T2OLE ничего не сделает. Если psText действительно char *, вы должны использовать A2OLE, чтобы убедиться, что строка преобразована в UNICODE. Код маршалинга .NET не поддерживает двоичный BSTR, то есть BSTR с символами, отличными от UNICODE.

...