我对我的缓冲地带的一些价值观来自何方以及我为什么会迷惑不解地理解。 执行。
Here is my case:
In my system I have a native application that talks to a managed service through named pipes. The native application uses WriteFile(pipehandle, &msg, sizeof(msg), &cbBytes, NULL)
to send data held by the following structs:
struct NotificationMessageHeader
{
__int32 A;
__int64 B;
__int32 MessageType;
__int32 D;
};
struct NotificationMessageA
{
NotificationMessageHeader Header;
unsigned char X;
wchar_t Y[MAX_PATH];
};
管理服务有这些结构管理的版本,包括:
[StructLayout(LayoutKind.Sequential)]
public struct NotificationMessageHeader
{
public UInt32 A;
public UInt64 B;
public UInt32 MessageType;
public UInt32 D;
}
[StructLayout(LayoutKind.Sequential)]
public struct NotificationMessageA
{
public NotificationMessageHeader Header;
[MarshalAs(UnmanagedType.I1)]
public byte X;
[MarshalAs(UnmanagedType.LPWStr)]
public string Y;
}
当我从本土应用中发送数据时,我所做的第一件事就是将缓冲转化为一种通用结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct GenericNotificationMessage
{
public NotificationMessageHeader Header;
}
在我确信电文类型得到支持之后,确定电文类型是哪一种电文类型,作为利用这一功能的适当结构,将这一缓冲的其余部分编码为:
T GetMessageAsStructure<T>(object data)
where T : struct
{
T output = default(T);
GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
try
{
IntPtr dataPtr = handle.AddrOfPinnedObject();
output = (T)Marshal.PtrToStructure(dataPtr, typeof(T));
}
finally
{
handle.Free();
}
return output;
}
还有两条电话:<代码> GetMessageAsStructure。 一种类型的论据是Generic notificationMessage
,该编码只贴上了标题,而且正确操作——我照预期在标题领域获得数值。 然后,在我发现电文属于我称之为<代码>的类型。 GetMessageAsStructure with the category para amount - in this case NotificationMessageA
.
...... 在此,事情开始出现坏。 CLR没有进入例外。 我试图审视我在管理一侧的缓冲地带的价值观,例如,当我寄出像:
NotificationMessageA msg = { };
memset(&msg, 0, sizeof(msg));
msg.Header.A = 2;
msg.Header.B = 999;
msg.Header.MessageType = 1;
msg.Header.D = 3;
msg.X = 64;
wcscpy(msg.Y, L"somexec.exe");
DWORD written = 0;
WriteFile(_hPipe, &msg, sizeof(msg), &written, NULL);
管理下的缓冲值如下:
[0] 2 <---- This shouldn t be at index 3?
[1] 0
[2] 0
[3] 0
[4] 0
[5] 0
[6] 0
[7] 0
[8] 231 <--- WTF is this? should t it start at index 11?
[9] 3
[10] 0
[11] 0
[12] 0
[13] 0
[14] 0
[15] 0
[16] 1
[17] 0
[18] 0
[19] 0
[20] 3
[21] 0
[22] 0
[23] 0
[24] 64
[25] 0
[26] 115
[27] 0
[28] 111
[29] 0
[30] 109
[31] 0
[32] 101
[33] 0
[34] 101
[35] 0
[36] 120
[37] 0
[38] 101
[39] 0
[40] 99
[41] 0
[42] 46
[43] 0
[44] 101
[45] 0
[46] 120
[47] 0
[48] 101
[49] 0
[50] 0
但是,由于Im使用={><>>>>>>/code,在C++中,Imm使用“
使初始化成为违约值,并且不会影响配对加固结构,但情况并非如此,因为即使使用
memset(......, 0, ......)
,tt t 影响收受的tes。
仅加一只头盔就完美地编码,只有在I m试图打上其他结构的编码时,这个结构有一毫升的系统。 执行。
而且,经过管理的缓冲地带没有我期望它通过审视我的结构来做到这一点。
为什么?
更令人费解的是,视像演播室报告说,所投掷的东西是执行评价,而MSDN说,这一例外不是由时间推移而来的,而是过时的。
我在把这扼杀起来时做了什么错误呢?