以下代码片段使用 GetUserNameA():
std::string getUserName()
{
DWORD nameLength = 64;
LPSTR computerName = new CHAR[nameLength];
GetUserNameA(computerName, &nameLength);
std::string name(computerName);
delete[] computerName;
return name;
}
在 MinGW 下正常工作,但在 MSVC 下不能正常工作。这是它抛出的链接错误:
windowsoptions.obj:-1: 错误: LNK2019: 函数“class std::basic_string,class std::allocator > __cdecl WindowsOptions::getUserName(void)”中未解析的外部符号引用 __imp_GetUserNameA (?getUserName@WindowsOptions@@YA?AV ?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
这段代码使用 GetDiskFreeSpaceA():
int64_t WindowsOptions::getDriveTotalSize(const std::string &driveName)
{
DWORD totalClusters;
DWORD freeClusters;
DWORD sectorsPerCluster;
DWORD bytesPerSector;
GetDiskFreeSpaceA(driveName.c_str(),
§orsPerCluster,
&bytesPerSector,
&freeClusters,
&totalClusters);
int64_t totalBytes = totalClusters * sectorsPerCluster * bytesPerSector;
return totalBytes;
}
并在 MinGW 的一个版本(在另一个版本下一切正常)和 MSVC 下给出不正确的结果。
如您所见,最后一个函数将返回值相乘并计算磁盘上的总字节数。在调试时,我发现了以下内容:
总集群 = 121804599
扇区每簇 = 8
字节每扇区 = 512
总集群 * 扇区每集群 = 974436792
totalClusters * sectorPerCluster * bytesPerSector = 695431168(错误!)
好像溢出一样,虽然64位足够存储任何驱动器的容量值。
如果我更深入地了解这个话题......我必须寻求帮助。
DWORD (uint32_t) 相乘的结果是一个 DWORD。它会溢出,然后你把它放在 int64_t 中。
乘 int64_t: