以前发现此类函数失败总找不到原因,只知道只要弄个临时新分配的空间,把字串拷过去,再调用就能成功,这是因为新分配的内存总是对齐的。测试了一下,的确如此:BYTE* u8_Mem = (BYTE*)GlobalAlloc(GMEM_FIXED, 100) + 1;WCHAR* u16_Text = (WCHAR*)u8_Mem;wcscpy(u16_Text, L"Hello World");BOOL b_Ret = SetWindowTextW(h_Wnd, u16_Text);一定会失败,+1换成+2就成功,奇数就失败。
后来在测试环境上再次遇到(同样是HP的单磁带机),深入研究才发现WriteFile也要内存对齐。
然后在研究SCSI指令时,发现这些硬件好像是有个内存对齐的参数。
当时是寸参数的类是new的,因此分配出来的参数地址没有对齐导致函数调用失败,后来先用一个临时变量来获取数据,完了再赋值给类变量的