【问题标题】:Marshal C# string to C++ tchar through streamwriter通过streamwriter将C#字符串编组为C++ tchar
【发布时间】:2015-02-23 18:56:58
【问题描述】:

Related question

在 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。有什么建议吗?

【问题讨论】:

  • 请记住,TCHAR 并不是真正确定的类型。在程序员决定之后,这是一种类型的可能性。请参阅tchar tag-wiki
  • 您真的还在为 Windows 98 编写代码吗?没有其他理由使用TCHAR
  • 不,抱歉,我的 Windows C/C++ 体验充其量是参差不齐的。它显然是一个 wchar_t。我把它与 BSTR 和 com interop 之类的东西混淆了。我也许可以通过更多的尝试和错误来回答这个问题。
  • @Deduplicator,你是对的。你如何决定TCHAR in DEV_BROADCAST_DEVICEINTERFACE

标签: c# encoding pinvoke tchar


【解决方案1】:

根据您的 cmets,您实际上需要 UTF-16 编码的文本。这对应于Encoding.Unicode。所以你会使用

new StreamWriter(pipeClient, Encoding.Unicode)

也就是说,您至少还应该考虑字节序问题。通过网络传输数据时,我希望您在结束时转换为网络字节顺序,并在接收时转换为主机字节顺序。

【讨论】:

  • 我需要找到更多的证据,我同意你的看法。我认为是讨厌的流业务与管道的消息模式交互不佳。我会尽快报告
【解决方案2】:

这不是一个直接的答案,因为它没有像目标那样使用流写入器。但是由于限制,这种方法效果很好。

解决方法:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多