2

我正在使用以下代码来获取要保存到用于 tinyxml2 的文件路径:

OPENFILENAME ofn;

char szFileName[MAX_PATH] = "";

ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn); 
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"XML Files (*.xml)\0*.xml\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"xml";
GetSaveFileName(&ofn);

这工作正常并显示对话框但是当我在 szFileName 中查找返回值时,它似乎包含许多空字符:

szFileName  0x0026f5b0 "C"  char[0x00000104]
[0x00000000]    0x43 'C'    char
[0x00000001]    0x00 '\0'   char
[0x00000002]    0x3a ':'    char
[0x00000003]    0x00 '\0'   char
[0x00000004]    0x5c '\\'   char
[0x00000005]    0x00 '\0'   char
[0x00000006]    0x61 'a'    char
[0x00000007]    0x00 '\0'   char
[0x00000008]    0x73 's'    char
[0x00000009]    0x00 '\0'   char
[0x0000000a]    0x64 'd'    char
[0x0000000b]    0x00 '\0'   char
[0x0000000c]    0x61 'a'    char
[0x0000000d]    0x00 '\0'   char
[0x0000000e]    0x73 's'    char
[0x0000000f]    0x00 '\0'   char
[0x00000010]    0x64 'd'    char
[0x00000011]    0x00 '\0'   char
[0x00000012]    0x61 'a'    char
[0x00000013]    0x00 '\0'   char
[0x00000014]    0x73 's'    char
[0x00000015]    0x00 '\0'   char
[0x00000016]    0x2e '.'    char
[0x00000017]    0x00 '\0'   char
[0x00000018]    0x78 'x'    char
[0x00000019]    0x00 '\0'   char
[0x0000001a]    0x6d 'm'    char
[0x0000001b]    0x00 '\0'   char
[0x0000001c]    0x6c 'l'    char

当传递给 tinyxml2 时,最终会保存一个名称为 1 个字符长的文件,以及 szFileName 中的第一个字符。

为什么要在每个字符之后添加这些空字符?

4

2 回答 2

3

你打电话GetSaveFileNameW而不是GetSaveFileNameA. 声明szFileNameTCHAR(或WCHAR)的数组。

该名称GetSaveFileName将解析为名称GetSaveFileNameWGetSaveFileNameA取决于#define您的代码(或项目设置)中的名称。默认情况下,它_UNICODE在现代 Visual Studio 版本中定义(“宽字符”)。

如果将它传递给另一个需要特定字符集的库,则可能必须转换 usingWideCharToMultiByte或相关函数。

另外:不要像使用szFileName(being char[MAX_PATH]) 和(LPWSTR).

于 2013-04-03T01:41:26.660 回答
0

我不是 Win32 API 的专业人士,但是:

ofn.lpstrFile = (LPWSTR)szFileName;

您正在使用LPWSTR,它是“指向 16 位 Unicode 字符的字符串的 32 位指针”。这意味着每个字符都被编码为两个字节。由于 ASCII 字符值适合单个字节,我将假设第二个始终设置为 0。

于 2013-04-03T01:42:54.037 回答