万一有人来看这段代码,这里的解决方案就是我的看法:
问题 #1
DWORD disk_serialINT[MAX_PATH + 1];
DWORD
当您只需要一个值时声明一组值。
MAX_PATH
在不了解其用途的情况下使用宏(并向其添加 1)。
INT
不知道类型(当DWORD
类型为unsigned时命名变量)。
- 不了解问题域(
disk_serial
实际上是卷序列号时命名变量)。
问题 #2
GetVolumeInformationA(NULL, NULL, NULL, disk_serialINT, NULL, NULL, NULL, NULL);
- 没有错误处理(不检查函数返回值是否失败)。
- 不理解按值传递参数和按引用传递参数之间的区别(不传递
disk_serialINT
变量的地址)。
问题 #3
char* disk_serialANSI;
- 不了解数组和指针之间的区别。
- 不了解静态分配和动态分配之间的区别。
问题 #4
sprintf(disk_serialANSI, "%d", disk_serialINT);
- 使用未初始化的变量
disk_serialANSI
。
- 使用错误的变量类型(要么使用 数组
char
,要么保留指针但分配内存并稍后释放它)。
- 不了解问题域(卷序列号使用错误格式,应该是
%08lX
)。
- 不使用安全版本的
sprintf
.
问题 #5
std::string HDDserial = disk_serialANSI;
换句话说,所有典型的初学者程序员错误。希望他们在此期间学到更多,而不仅仅是在 Stack Overflow 上为他们的问题找到答案。
上面已经有 David Heffeman 提供的 C++ 解决方案,所以为了回答的完整性,这里是等效的 C 解决方案:
#include <stdio.h>
#include <windows.h>
int main()
{
const int VolumeSerialLength = 9; // 8 hex digits + zero termination
char VolumeSerial[VolumeSerialLength] = { 0 };
DWORD VolumeSerialNumber;
if (GetVolumeInformationA(NULL, NULL, NULL, &VolumeSerialNumber, NULL, NULL, NULL, NULL) {
sprintf_s(VolumeSerial, VolumeSerialLength, "%08lX", VolumeSerialNumber);
printf("Volume serial number: %8.8s.\n", VolumeSerial);
return 0;
} else {
printf("GetVolumeInformationA() error: %08lX\n", GetLastError());
return 1;
}
}