我正在尝试将两个 PUNICODE_STRING 结构写入文件,但写入的数据无效,有什么想法吗?
(本例中data1为123
,data2为456
)
DWORD dwBytesWritten = 0;
WCHAR buffer[1024];
HANDLE hFile = CreateFile(L"c:\\log.txt", FILE_APPEND_DATA, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
memset(buffer, 0, sizeof(buffer));
wsprintf(buffer, L"%s :: %s\r\n", Data1->Buffer, Data2->Buffer);
WriteFile(hFile, buffer, wcslen(buffer), &dwBytesWritten, NULL);
CloseHandle(hFile);
}
最佳答案
主要错误是
WriteFile(hFile, buffer, wcslen(buffer), &dwBytesWritten, NULL);
WriteFile
always take 要写入文件的字节数。但是wcslen
返回 字符 的数量,以防 UINICODE 减少 2 倍 - 需要 * sizeof(WCHAR)
或 << 1
然后是格式 UNICODE_STRING
需要使用%wZ
格式 - 因为在一般情况下 Buffer
不能以 0 终止。更好地使用swprintf
或 _snwprintf
相反 wsprintf
.
最后总是更好的动态分配需要的缓冲区,然后使用硬编码大小,它可以被覆盖
所以我将使用下一个代码:
void test(PCUNICODE_STRING Data1, PCUNICODE_STRING Data2)
{
DWORD dwBytesWritten;
PWSTR buffer = (PWSTR)alloca(Data1->Length + Data2->Length + sizeof(L" :: \r\n"));
int n = swprintf(buffer, L"%wZ :: %wZ\r\n", Data1, Data2) * sizeof(WCHAR);
HANDLE hFile = CreateFile(L"c:\\log.txt", FILE_APPEND_DATA, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
WriteFile(hFile, buffer, n, &dwBytesWritten, NULL);
CloseHandle(hFile);
}
}
关于c++ - 将 PUNICODE_STRING 写入文件,得到垃圾数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786473/