Именованный канал C ++ WriteFileEx / ReadFile, unicode / ansi

0

Я пытаюсь передать данные из приложения x64 в приложение x86 с использованием именованных каналов и перекрытия ввода-вывода, как то, что определено здесь:

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

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

В моем клиентском приложении есть набор символов в Юникоде, а набор символов сервера "не установлен", который, как я полагаю, по умолчанию имеет значение multibyte. Я не могу изменить набор символов сервера для юникода.

Будет ли это повреждение данных просто потому, что мне нужно преобразовать из многобайтового в широкий символ на клиенте после того, как я получаю/читаю структуру данных? Если это так, то встроены вспомогательные функции, которые я могу сделать для этого?

Структура данных отправляется (определяется идентично на сервере и клиенте):

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);
  • 0
    Традиционно вы хотели бы передать указатель void в качестве буфера. Если вы не можете гарантировать, что структура является байтовой для байта, идентичной на клиенте и сервере, вам нужно будет правильно сериализовать / десериализовать ее.
  • 1
    ReadFile / WriteFileEx не зависят от настроек Юникода. Проблема в другом. Непонятно, почему вы wchar_t* , потому что оба они принимают void* .
Показать ещё 2 комментария
Теги:
file-io
pipe

2 ответа

1
Лучший ответ

Каков тип _meshes в вызове ReadFile? Если это указатель, вы будете читать указатель, а не данные, на которые указывают:

&_meshes

Должно быть:

_meshes

Кроме того, похоже, что вы записываете информацию HANDLE и OVERLAPPED специфичные для конкретного OVERLAPPED. Вы имели в виду написать их?

Вам нужно будет добавить больше кода для лучшей помощи.

  • 0
    Я считаю, что отправка данных HANDLE и OVERLAPPED в структуре стала причиной того, что я получил неверно выровненные данные на стороне клиента, потому что после удаления их из отправки они просто работают. Благодарю.
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()
  • 0
    Эта структура будет одинаково упакована на x86 и x64. Нет необходимости делать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню