C ++命名管道WriteFileEx / ReadFile,unicode / ansi

时间:2014-08-21 04:43:03

标签: c++ windows file-io pipe

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

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

2 个答案:

答案 0 :(得分:1)

_meshes来电中ReadFile的类型是什么?如果它是一个指针,你将读入指针,而不是指向的数据:

&_meshes

应该是:

_meshes

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

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

答案 1 :(得分:0)

您需要确保以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()