Есть C++ ActiveX OCX со следующей декларацией ODL:Как преобразовать C++ PBSTR в C# строка
DISP_FUNCTION(CHellerCommCtrl, "GetRecipePath", GetRecipePath, VT_I4, VTS_PBSTR)
нужно позвонить GetRecipePath из C программы # и преобразовать результирующую C++ BSTR в C# строку. знает, от других сообщений, следующим решения:
string s1 = Marshal.PtrToStringAnsi((IntPtr)outPtr);
Проблемы, прототип GetRecipePath в C# с помощью Interop имеет аргумент «реф строку» и не позволит мне типаж результирующей «строки» в «IntPtr», а затем передать это методу маршала. Как преобразовать «строку», полученную из GetRecipePath [которая действительно является BSTR], в строку C#?
C++ является байт [], который заканчивается на '\ 0'. Используйте Encoding.UTF8.GetString (byte []) для преобразования в строку. – jdweng
Я дам ваше предложение попробовать, но должен отметить, что BSTR является строкой Unicode, а не строкой байта [ASCII]. Я считаю, что это то, что делает метод Маршалла, конвертирует Unicode в ASCII. –
Не клади слова в рот. Я никогда не использовал ASCII. Если у вас есть два байтовых символа, чем использование кодировки Unicode вместо UTF8. Ascii удаляет непечатаемые символы. – jdweng