c++ - 将 PUNICODE_STRING 写入文件,得到垃圾数据

标签 c++ windows visual-c++

我正在尝试将两个 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/

相关文章:

c++ - 当我终止应用程序时无法保存写入文件的数据

C++ 仿函数和列表模板

C++ Linked List——一个新的指针,不用于遍历列表可以打印列表吗?

python - 通过Windows Task Scheduler 调用python 脚本时,如何正确导入用户定义的模块(包)?

visual-c++ - 如何从其句柄获取图标的尺寸?

C++ 如何防止无效输入?

windows - 是否可以将两个调试器附加到一个进程?

C++ 模块 : do included 3rd party files still pull in normal headers if a standard library module is included first?

php - VC++ 2008 制作的 C++ EXE 可以在 Windows 7 上运行,但不能在 XP 上运行

c++ - mingw g++ 无法与库链接