Я пытаюсь передать данные из приложения 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);
Каков тип _meshes
в вызове ReadFile
? Если это указатель, вы будете читать указатель, а не данные, на которые указывают:
&_meshes
Должно быть:
_meshes
Кроме того, похоже, что вы записываете информацию HANDLE
и OVERLAPPED
специфичные для конкретного OVERLAPPED
. Вы имели в виду написать их?
Вам нужно будет добавить больше кода для лучшей помощи.
Вам необходимо убедиться, что структура отправлена и получена с 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()
ReadFile
/WriteFileEx
не зависят от настроек Юникода. Проблема в другом. Непонятно, почему выwchar_t*
, потому что оба они принимаютvoid*
.