2015-02-23 5 views
-1

Related questionМаршал C# строка C++ TCHAR через StreamWriter

В C++, я требую строку TCHAR (LPTSTR). C# StreamWriters могут выводить ASCII, Unicode, UTF32 и т. Д. ... Не строки TCHAR.

Я не вызываю функцию в C++, я отправляю строковое сообщение по именованному каналу.

C#:

using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "mynamedpipe", PipeDirection.InOut)) 
using (StreamWriter sw = new StreamWriter(pipeClient, Encoding.UTF8)) 
using (StreamReader sr = new StreamReader(pipeClient, Encoding.Unicode)) 
{ 
    pipeClient.Connect(); 
    pipeClient.ReadMode = PipeTransmissionMode.Message; 
    sw.Write("Howdy from Kansas"); 
    sw.Flush(); 

    var b = sr.ReadLine(); 
    Console.Write(b); 
} 

C++ ожидает TCHAR. Предложения?

+0

Помните, что 'TCHAR' на самом деле не является определенным типом. Это возможность типа, после того, как программист решает. См. [Tchar tag-wiki] (https://stackoverflow.com/tags/tchar/info). – Deduplicator

+0

Действительно ли вы по-прежнему кодируете Windows 98? Нет другой причины использовать 'TCHAR'? –

+0

Нет, извините, мой опыт работы с Windows C/C++ в лучшем случае пятнистый. По-видимому, это wchar_t. Я сбивал с толку таких, как BSTR и com interop. Я могу ответить на этот вопрос еще несколькими пробными ошибками. –

ответ

0

Это не прямой ответ, так как он не использует streamwriter, как и цель. Из-за ограничений, однако, этот подход работает очень хорошо.

Обход:

using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "mynamedpipe", PipeDirection.InOut)) 
{ 
    pipeClient.Connect(); 
    pipeClient.ReadMode = PipeTransmissionMode.Message; 
    var msg = Encoding.Unicode.GetBytes("Hello from Kansas!"); 
    pipeClient.Write(msg, 0, msg.Length); 
} 
0

В соответствии с вашими комментариями, вы на самом деле нужно UTF-16 в кодировке текста. Это соответствует Encoding.Unicode. Таким образом, вы бы использовали

new StreamWriter(pipeClient, Encoding.Unicode) 

При этом вы должны, по крайней мере, рассмотреть вопрос о контенте. При передаче данных по сети я ожидаю, что вы перейдете в сетевой порядок байтов при завершении и конвертируете в порядок байтов хоста при приеме.

+0

Мне нужно найти немного больше доказательств, и я согласен с вами. Я думаю, что это был неприятный поток, который плохо взаимодействовал с режимом сообщений в трубах. Я скоро отправлю отчет –