0

我想使用 GetVolumeInformation 调用来检索可移动设备的名称。我可以很好地检索名称并将其存储到 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'

稍后将其用于字符串连接。有没有办法来解决这个问题?

4

2 回答 2

2

看起来您正在使用 unicode Win32 API。您应该使用 _tprintf 以便根据字符类型使用适当的函数(printf 或 wprintf)。

如果您不了解 unicode - 这里有一个快速概述。发生这种情况的原因是常规 ascii 字符的 unicode 是一个空字节,后跟 ascii 字符。这就是为什么您会看到用空值填充的字符串。

请注意,使用 TCHAR 时,您还应该将所有字符串包装在 _T() 宏中,以便它们也被声明为正确的类型。如果您始终遵循这一点,则从 unicode 转换为 ansi 只是更改预处理器指令的问题。

于 2010-07-14T22:42:19.097 回答
0

原因是您使用的是 Unicode 版本的 Win32 API。

并且有 2 个修复。第一种是使用标准版本的 API,如果您使用 Visual Studio,可以通过在 Projects-> Properties-> Configuration Properties-> General-> Character Set 中将项目的 Character Set 更改为“Not set”来完成,或者如果您不使用 VS,请确保在包含 windows.h 之前没有 #defined UNICODE。

正如 mdma 所说,第二个修复是使用 Unicode 文本操作函数 wprintf 或使用标准库中的 %S。这是首选修复,因为您的程序将变得易于国际化,并且可以使用文件名使用的任何字符集。然而,这意味着所有下游功能也需要使用 Unicode,这可能意味着大量工作,具体取决于项目的大小。

于 2010-07-14T23:07:12.173 回答