Код не неправильный, но среда выполнения .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 может получить лучшие результаты, если будет сказано, что это возвращаемое значение;