数组存储名称从GetVolumeInformation奇异地检索在Visual C ++中?
-
15-09-2020 - |
题
我想使用getVolumenInformation调用来检索可移动设备的名称。我可以检索姓名刚刚精细并存储到TCHAR数组变量SZVOLNAMEBUFF中。这是我的代码:
// Get Volume Information to check for NTFS or FAT
TCHAR szFileSys[256];
TCHAR szVolNameBuff[256];
DWORD dwSerial = 0;
DWORD dwMFL = 0;
DWORD dwSysFlags = 0;
bool bSuccess;
char fileType[255];
int bSuccessdebug = 0;
//LPCTSTR temp = _T("E:\\"); For debugging only
bSuccess = GetVolumeInformation(drivePath,
szVolNameBuff,
sizeof(szVolNameBuff),
&dwSerial,
&dwMFL,
&dwSysFlags,
szFileSys,
sizeof(szFileSys));
.
当我尝试使用行打印变量的内容:
printf("szVolNameBuff holds: %s \n", &szVolNameBuff);
.
我得到一个“t”的输出,而不是名称“transcend”,它是驱动器的名称。我用Visual Studio 2008调试它,发现TCHAR阵列将名称存储为: [0]'t' [1] 0 [2]'r' [3] 0 [4]'a' [5] 0 [6]'n' [7] 0
等等。这是为什么?我希望数组将单词存储为仅限:
[0]'t' [1]'r' [2]'A' [3]'n' [4]'s'
以后将其用于字符串连接。有没有办法解决这个问题?
解决方案
看起来您使用Unicode Win32 API。您应该使用_tprintf,以便根据字符类型使用相应的功能(printf或wprintf)。
如果您不知道Unicode - 这是一个快速概述。发生这种情况的原因是常规ASCII字符的Unicode是一个空字节,后跟ASCII字符。这就是为什么你看到用空缺填充的字符串。
请注意,使用TCHAR时,您还应在_t()宏中包装所有字符串,以便它们也被声明为正确的类型。如果您始终如一,请从Unicode转换为ANSI只是改变预处理器指令的问题。
其他提示
为什么您正在使用Win32 API的Unicode版本。
并且有2个修复。首先是使用API的标准版本,如果您使用的是Visual Studio,可以通过将项目的字符集更改为“未设置”在“项目” - >“属性” - >“配置属性” - >“常规” - >“字符”集中,或者通过确保Unicode不是#definined,例如,如果您没有使用VS,则为Windows.h。
作为MDMA表示,第二修复程序是在标准库中使用Unicode文本操作函数wprintf或使用%s。这是首选修复程序,因为您的程序将成为国际化友好,并使用文件名正在使用的任何字符集。然而,这意味着所有下降流函数也需要使用Unicode,这可能意味着很多工作,具体取决于项目的大小。