【问题标题】:C++ Named Pipe WriteFileEx / ReadFile, unicode / ansiC++ 命名管道 WriteFileEx / ReadFile, unicode / ansi
【发布时间】:2014-08-21 04:43:03
【问题描述】:

我正在尝试使用命名管道和重叠 I/O 将数据从 x64 应用程序传递到 x86 应用程序,就像这里定义的那样:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365603(v=vs.85).aspx

我的服务器应用程序对 WriteFileEx 的调用成功并且我通过管道发送的结构似乎没问题,但是当我在客户端调用 ReadFile 时,我检索的数据结构已损坏或与我发送的数据不同,但它也成功读取。

我的客户端应用程序有一个 unicode 字符集,而服务器的字符集是“未设置”,我假设默认为多字节。我无法将服务器的字符集更改为 unicode。

这种数据损坏是否只是因为我在检索/读取数据结构后需要在客户端上从多字节转换为宽字符?如果是这样,我可以调用内置的辅助函数吗?

正在发送的数据结构(在服务器和客户端上定义相同):

typedef struct
{
    int id;
    float vertices[VERTICES_COUNT][VERTICES_COMPONENTS];
    unsigned short indices[INDICES_COUNT];
    float texCoords[TEXTURE_COORD_COUNT][TEXTURE_COORD_COMPONENT];
    unsigned char texData[TEXTURE_SIZE];
} MESHINST, *LPMESHINST;

typedef struct
{
    OVERLAPPED oOverlap;
    HANDLE pipeInst;
    int addedCount;
    MESHINST meshes[MESH_GROUP_BUFFER];
    int removedCount;
    int removed[MESH_REMOVE_BUFFER];

} MESHGROUPINST, *LPMESHGROUPINST;

服务器上的 WriteFileEx 调用:

LPMESHGROUPINST meshes = (LPMESHGROUPINST)lpOverLap;
fWrite = WriteFileEx(
    meshes->pipeInst,
    (wchar_t*)meshes,
    sizeof(MESHGROUPINST),
    (LPOVERLAPPED)meshes,
    (LPOVERLAPPED_COMPLETION_ROUTINE)CompletedWriteRoutine);

在客户端调用ReadFile:

(在标题中)

MESHGROUPINST _meshes;

(在 cpp 中)

do
{
    _success = ReadFile(
        _pipe,
        (wchar_t*)&_meshes,
        sizeof(MESHGROUPINST),
        &_numOfBytesRead,
        NULL);
} while (!_success);

【问题讨论】:

  • 传统上,您希望传递一个 void 指针作为缓冲区。如果您不能保证客户端和服务器上的结构是逐字节相同的,则需要正确序列化/反序列化它。
  • ReadFile/WriteFileEx 不受 Unicode 设置的影响。问题在别处。也不清楚你为什么要投到wchar_t*,因为这两个都是void*
  • 问题不在于 Unicode/ANSI。问题是 64 位/32 位。您的结构包括一个OVERLAPPED 结构和一个HANDLE,两者都在64 位和32 位之间改变大小,@CoryNelson 指出don't make sense to transfer between processes anyway
  • 我会将这些从实际写入/发送的结构中剔除(我回家后会对其进行测试),然后我会看看它是如何进行的。谢谢。

标签: c++ windows file-io pipe


【解决方案1】:

ReadFile 调用中的_meshes 是什么类型?如果是指针,您将读取指针,而不是指向的数据:

&_meshes

应该是:

_meshes

此外,您似乎正在编写特定于流程的 HANDLEOVERLAPPED 信息。你的意思是写那些吗?

您需要添加更多代码以获得更好的帮助。

【讨论】:

  • 在结构中发送 HANDLE 和 OVERLAPPED 数据最终是我相信客户端数据未对齐的原因,因为在将其从发送中删除后它就可以工作了。谢谢。
【解决方案2】:

您需要确保以 1 字节打包发送和接收结构。在您希望发送/接收的结构周围使用#pragma pack(1)

#pragma pack(1)
typedef struct
{
    int id;
    float vertices[VERTICES_COUNT][VERTICES_COMPONENTS];
    unsigned short indices[INDICES_COUNT];
    float texCoords[TEXTURE_COORD_COUNT][TEXTURE_COORD_COMPONENT];
    unsigned char texData[TEXTURE_SIZE];
} MESHINST, *LPMESHINST;
#pragma pack()

【讨论】:

  • 这个结构在 x86 和 x64 上的打包方式相同。不需要这样做。
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 2016-07-02
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
相关资源
最近更新 更多