我想使用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,这可能意味着很多工作,具体取决于项目的大小。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top