【发布时间】: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。 -
我会将这些从实际写入/发送的结构中剔除(我回家后会对其进行测试),然后我会看看它是如何进行的。谢谢。