Если бы мне пришлось скопировать память, я думаю, что следующий будет работать:
static Stream^ UnicodeStringToStream(LPCWSTR szUnicodeString)
{
//validate the input parameter
if (szUnicodeString == NULL)
{
return nullptr;
}
//get the length of the string
size_t lengthInWChars = wcslen(szUnicodeString);
size_t lengthInBytes = lengthInWChars * sizeof(wchar_t);
//allocate the .Net byte array
array^ byteArray = gcnew array(lengthInBytes);
//copy the unmanaged memory into the byte array
Marshal::Copy((IntPtr)(void*)szUnicodeString, byteArray, 0, lengthInBytes);
//create a memory stream from the byte array
return gcnew MemoryStream(byteArray);
}
Примечание: этот ответ работает только в небезопасном коде. Если вы не компилируете флаг небезопасности, вам может быть повезло, если вы разделите данные на массив байтов, а затем завершите этот массив байтов в потоке. См. Здесь: http://stackoverflow.com/a/11660831/684852 Однако вам нужно знать длину данных (количество байтов в исходной строке Unicode у вашего указателя). Например: `byte [] dataArray = новый байт [dataLength]; Marshal.Copy (szUnicodeString, dataArray, 0, dataLength); MemoryStream stream = новый MemoryStream (dataArray); ` – 2013-12-22 21:57:57