如何获取硬盘序列号? 如何获取硬盘序列号?并转化为字符串?谢谢高手! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CString strResult; char Name[MAX_PATH]; DWORD serno; DWORD length; DWORD FileFlag; char FileName[MAX_PATH]; BOOL Ret; Ret = GetVolumeInformation(strRoot, Name, MAX_PATH, &serno, &length, &FileFlag, FileName, MAX_PATH); if (Ret) strResult.Format("%ld", serno); return strResult.AllocSysString(); http://www.codeproject.com/system/system_information.asp //获得当前驱动器名CString strRootPathName;GetWindowText(strRootPathName);// LPCTSTR lpRootPathName = strRootPathName; LPTSTR lpVolumeNameBuffer=new char[12]; DWORD nVolumeNameSize=12; DWORD VolumeSerialNumber; DWORD MaximumComponentLength; DWORD FileSystemFlags; LPTSTR lpFileSystemNameBuffer=new char[10]; DWORD nFileSystemNameSize=10; GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, &VolumeSerialNumber, &MaximumComponentLength, &FileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); //显示磁盘序列号 CString str; str.Format("当前磁盘序列号:",strRootPathName,VolumeSerialNumber); AfxMessageBox(str); http://www.vckbase.com/document/viewdoc.asp?id=706 // CHardwareID.cpp : Implementation of CHardwareID#include "stdafx.h"#include "HardwareID.h"#include "CHardwareID.h"#include <stdio.h>#include <Iphlpapi.h>/////////////////////////////////////////////////////////////////////////////// CHardwareID#ifdef _UNICODE#define _tsprintf wsprintf#else#define _tsprintf sprintf#endif#define DFP_GET_VERSION 0x00074080 #define DFP_SEND_DRIVE_COMMAND 0x0007c084 #define DFP_RECEIVE_DRIVE_DATA 0x0007c088 typedef struct _GETVERSIONOUTPARAMS{ BYTE bVersion; // Binary driver version. BYTE bRevision; // Binary driver revision. BYTE bReserved; // Not used. BYTE bIDEDeviceMap; // Bit map of IDE devices. DWORD fCapabilities; // Bit mask of driver capabilities. DWORD dwReserved[4]; // For future use. } GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;typedef struct _IDEREGS{ BYTE bFeaturesReg; // Used for specifying SMART "commands". BYTE bSectorCountReg; // IDE sector count register BYTE bSectorNumberReg; // IDE sector number register BYTE bCylLowReg; // IDE low order cylinder value BYTE bCylHighReg; // IDE high order cylinder value BYTE bDriveHeadReg; // IDE drive/head register BYTE bCommandReg; // Actual IDE command. BYTE bReserved; // reserved for future use. Must be zero. } IDEREGS, *PIDEREGS, *LPIDEREGS; typedef struct _SENDCMDINPARAMS { DWORD cBufferSize; // Buffer size in bytes IDEREGS irDriveRegs; // Structure with drive register values. BYTE bDriveNumber; // Physical drive number to send // command to (0,1,2,3). BYTE bReserved[3]; // Reserved for future expansion. DWORD dwReserved[4]; // For future use. //BYTE bBuffer[1]; // Input buffer. } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; typedef struct _DRIVERSTATUS { BYTE bDriverError; // Error code from driver, // or 0 if no error. BYTE bIDEStatus; // Contents of IDE Error register. // Only valid when bDriverError // is SMART_IDE_ERROR. BYTE bReserved[2]; // Reserved for future expansion. DWORD dwReserved[2]; // Reserved for future expansion. } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS; typedef struct _SENDCMDOUTPARAMS { DWORD cBufferSize; // Size of bBuffer in bytes DRIVERSTATUS DriverStatus; // Driver status structure. BYTE bBuffer[512]; // Buffer of arbitrary length // in which to store the data read from the drive. } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; typedef struct _IDSECTOR { USHORT wGenConfig; USHORT wNumCyls; USHORT wReserved; USHORT wNumHeads; USHORT wBytesPerTrack; USHORT wBytesPerSector; USHORT wSectorsPerTrack; USHORT wVendorUnique[3]; CHAR sSerialNumber[20]; USHORT wBufferType; USHORT wBufferSize; USHORT wECCSize; CHAR sFirmwareRev[8]; CHAR sModelNumber[40]; USHORT wMoreVendorUnique; USHORT wDoubleWordIO; USHORT wCapabilities; USHORT wReserved1; USHORT wPIOTiming; USHORT wDMATiming; USHORT wBS; USHORT wNumCurrentCyls; USHORT wNumCurrentHeads; USHORT wNumCurrentSectorsPerTrack; ULONG ulCurrentSectorCapacity; USHORT wMultSectorStuff; ULONG ulTotalAddressableSectors; USHORT wSingleWordDMA; USHORT wMultiWordDMA; BYTE bReserved[128]; } IDSECTOR, *PIDSECTOR; VOID ChangeByteOrder(PCHAR szString, USHORT uscStrSize) { USHORT i; CHAR temp; for (i = 0; i < uscStrSize; i+=2) { temp = szString[i]; szString[i] = szString[i+1]; szString[i+1] = temp; } }void StrToHex(char* s, CComBSTR& bstr){ int sLen = strlen(s); char sTmp[3] = {NULL}; for (int i = 0; i < sLen; i ++) { sprintf(sTmp, "%x", s[i]); bstr += sTmp; }}char* RTrim(char* s){ int sLen = strlen(s); for (int i = 0; i < sLen; i ++) { if (isspace(s[sLen - i])) s[sLen - i] = NULL; } return s;}STDMETHODIMP CHardwareID::GetCPUID(BSTR *bstrCPUID){ CComBSTR bstr(""); char szCPUID[129] = {NULL}; char szTmp[33] = {NULL}; unsigned long s1 = 0, s2 = 0; _asm { mov eax,01h xor edx,edx cpuid mov s1,edx mov s2,eax } sprintf(szTmp, "%08X%08X", s1, s2); strcpy(szCPUID, szTmp); _asm { mov eax,03h xor ecx,ecx xor edx,edx cpuid mov s1,edx mov s2,ecx } sprintf(szTmp, "%08X%08X", s1, s2); strcat(szCPUID, szTmp); bstr = szCPUID; *bstrCPUID = bstr.Copy(); return S_OK;}STDMETHODIMP CHardwareID::GetHardDiskID(BSTR *bstrHardDiskID){ GETVERSIONOUTPARAMS vers; SENDCMDINPARAMS in; SENDCMDOUTPARAMS out; HANDLE h; DWORD i; BYTE j; //char hd[80]; TCHAR hd[80]; PIDSECTOR phdinfo; char s[41]; CComBSTR bstr(""); ZeroMemory(&vers,sizeof(vers)); for (j=0;j<4;j++) { //sprintf(hd,"\\\\.\\PhysicalDrive%d",j); _tsprintf(hd, TEXT("\\\\.\\PhysicalDrive%d"),j); h=CreateFile(hd,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); if (!h) { continue; } if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)) { CloseHandle(h); continue; } if (!(vers.fCapabilities & 1)) { CloseHandle(h); goto ErrHandle; } ZeroMemory(&in,sizeof(in)); ZeroMemory(&out,sizeof(out)); if (j & 1) { in.irDriveRegs.bDriveHeadReg=0xb0; } else { in.irDriveRegs.bDriveHeadReg=0xa0; } if (vers.fCapabilities & (16>>j)) { continue; } else { in.irDriveRegs.bCommandReg=0xec; } in.bDriveNumber=j; in.irDriveRegs.bSectorCountReg=1; in.irDriveRegs.bSectorNumberReg=1; in.cBufferSize=512; if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0)) { CloseHandle(h); goto ErrHandle; } phdinfo=(PIDSECTOR)out.bBuffer; memcpy(s,phdinfo->sModelNumber,40); s[40]=0; ChangeByteOrder(s,40); memcpy(s,phdinfo->sFirmwareRev,8); s[8]=0; ChangeByteOrder(s,8); memcpy(s,phdinfo->sSerialNumber,20); s[20]=0; ChangeByteOrder(RTrim(s),20); //bstr = s; StrToHex(s, bstr); CloseHandle(h); break; } ErrHandle: *bstrHardDiskID = bstr.Copy(); return S_OK;}STDMETHODIMP CHardwareID::GetNetworkCardID(BSTR *bstrNetworkCardID){ HMODULE hLib = LoadLibrary(TEXT("IPHLPAPI.DLL")); PIP_ADAPTER_INFO piai = NULL; ULONG ul = 0; char sTmp[4] = {NULL}; CComBSTR bstr(""); typedef DWORD (WINAPI *pgai)(PIP_ADAPTER_INFO, PULONG); pgai p = (pgai)GetProcAddress(hLib, "GetAdaptersInfo"); p(piai, &ul); piai = (PIP_ADAPTER_INFO)new BYTE[ul]; p(piai, &ul); for (int i = 0; i < (int)piai->AddressLength; i ++) { if (i < (int)piai->AddressLength - 1) sprintf(sTmp, "%02x-", piai->Address[i]); else sprintf(sTmp, "%02x", piai->Address[i]); bstr += sTmp; } FreeLibrary(hLib); *bstrNetworkCardID = bstr.Copy(); return S_OK;} 就在第一个扇区里面,自己找出来好了,fat12/16在偏移39字节处,fat32在偏移67字节处,(ntfs我忘了,不好意思),4字节长 已经用VC.NET2003封装好放进www.tom.com的信箱里,用户名:mycsdn2003密码111111,你看看吧 一个更狠的,不止能获取,还能修改http://www.codeproject.com/system/change_drive_sn.asp : 在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中 : 我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是 : 软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序 : 列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个 : api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所 : 以以读硬盘序列号为例, : 下面就先介绍一下我们要用到的api函数 : BOOL GetVolumeInformation( : LPCTSTR lpRootPathName, // 硬盘的路径 : LPTSTR lpVolumeNameBuffer, // 硬盘的卷标 : DWORD nVolumeNameSize, // 卷标的字符串长度 : LPDWORD lpVolumeSerialNumber, // 硬盘的序列号 : LPDWORD lpMaximumComponentLength, // 最大的文件长度 : LPDWORD lpFileSystemFlags, // 文件系统的一此标志 : LPTSTR lpFileSystemNameBuffer, // 存储所在盘符的分区类型的长指针变 : 量 : 量 : DWORD nFileSystemNameSize // 分区类型的长指针变量所指向的字符 : 串长度 : ); : 如果上述函数成功就返回一个非0值。 : : 光说不做,是不行了,我们还得实践一下:// 最大的文件长度 : 首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID, : 点击finish。 : 加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码: : LPCTSTR lpRootPathName="c:\\"; //取C盘 : LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标 : DWORD nVolumeNameSize=12;// 卷标的字符串长度 : DWORD VolumeSerialNumber;//硬盘序列号 : DWORD MaximumComponentLength;// 最大的文件长度 : LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的 : 长指针变量 : DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度 : : DWORD FileSystemFlags;// 文件系统的一此标志 : ::GetVolumeInformation(lpRootPathName, : lpVolumeNameBuffer, nVolumeNameSize, : &VolumeSerialNumber, &MaximumComponentLength, : &FileSystemFlags, : lpFileSystemNameBuffer, nFileSystemNameSize); : : CString str; : str.Format("Seria Num is %lx ",VolumeSerialNumber); : AfxMessageBox(str); http://expert.csdn.net/Expert/topic/2748/2748251.xml?temp=.4880792 再问个串口发送的小问题 在MDI中何通过代码关闭所有子窗口? unsigned char* 转换问题 关于彩色工具栏的问题。急!!! 如何确定特定路径下的数据库是否存在 如何取得没有绑定的DBGrid控件中指定行列的数据 着急,请问为什么不能用向导增加成员了 不知大家有没有在Vc中调用过存储过程 其中含有临时表? 请问有什么办法可以在PC机上读取苹果机刻录的光盘呢? 有相关的软件嘛 动态链接库dll都能被加载吗?[ Xtreme Toolkit Pro 最新正式版谁知道下载地址? 如何在OnReceive中收到完整的数据
char Name[MAX_PATH];
DWORD serno;
DWORD length;
DWORD FileFlag;
char FileName[MAX_PATH];
BOOL Ret;
Ret = GetVolumeInformation(strRoot, Name, MAX_PATH, &serno, &length, &FileFlag, FileName, MAX_PATH);
if (Ret)
strResult.Format("%ld", serno);
return strResult.AllocSysString();
CString strRootPathName;
GetWindowText(strRootPathName);
//
LPCTSTR lpRootPathName = strRootPathName;
LPTSTR lpVolumeNameBuffer=new char[12];
DWORD nVolumeNameSize=12;
DWORD VolumeSerialNumber;
DWORD MaximumComponentLength;
DWORD FileSystemFlags;
LPTSTR lpFileSystemNameBuffer=new char[10];
DWORD nFileSystemNameSize=10;
GetVolumeInformation(lpRootPathName,
lpVolumeNameBuffer, nVolumeNameSize,
&VolumeSerialNumber,
&MaximumComponentLength,
&FileSystemFlags,
lpFileSystemNameBuffer, nFileSystemNameSize); //显示磁盘序列号
CString str;
str.Format("当前磁盘序列号:",strRootPathName,VolumeSerialNumber);
AfxMessageBox(str);
#include "stdafx.h"
#include "HardwareID.h"
#include "CHardwareID.h"#include <stdio.h>
#include <Iphlpapi.h>
/////////////////////////////////////////////////////////////////////////////
// CHardwareID#ifdef _UNICODE
#define _tsprintf wsprintf
#else
#define _tsprintf sprintf
#endif#define DFP_GET_VERSION 0x00074080
#define DFP_SEND_DRIVE_COMMAND 0x0007c084
#define DFP_RECEIVE_DRIVE_DATA 0x0007c088 typedef struct _GETVERSIONOUTPARAMS
{
BYTE bVersion; // Binary driver version.
BYTE bRevision; // Binary driver revision.
BYTE bReserved; // Not used.
BYTE bIDEDeviceMap; // Bit map of IDE devices.
DWORD fCapabilities; // Bit mask of driver capabilities.
DWORD dwReserved[4]; // For future use.
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;typedef struct _IDEREGS
{
BYTE bFeaturesReg; // Used for specifying SMART "commands".
BYTE bSectorCountReg; // IDE sector count register
BYTE bSectorNumberReg; // IDE sector number register
BYTE bCylLowReg; // IDE low order cylinder value
BYTE bCylHighReg; // IDE high order cylinder value
BYTE bDriveHeadReg; // IDE drive/head register
BYTE bCommandReg; // Actual IDE command.
BYTE bReserved; // reserved for future use. Must be zero.
} IDEREGS, *PIDEREGS, *LPIDEREGS;
typedef struct _SENDCMDINPARAMS
{
DWORD cBufferSize; // Buffer size in bytes
IDEREGS irDriveRegs; // Structure with drive register values.
BYTE bDriveNumber; // Physical drive number to send
// command to (0,1,2,3).
BYTE bReserved[3]; // Reserved for future expansion.
DWORD dwReserved[4]; // For future use.
//BYTE bBuffer[1]; // Input buffer.
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; typedef struct _DRIVERSTATUS
{
BYTE bDriverError; // Error code from driver,
// or 0 if no error.
BYTE bIDEStatus; // Contents of IDE Error register.
// Only valid when bDriverError
// is SMART_IDE_ERROR.
BYTE bReserved[2]; // Reserved for future expansion.
DWORD dwReserved[2]; // Reserved for future expansion.
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS; typedef struct _SENDCMDOUTPARAMS
{
DWORD cBufferSize; // Size of bBuffer in bytes
DRIVERSTATUS DriverStatus; // Driver status structure.
BYTE bBuffer[512]; // Buffer of arbitrary length
// in which to store the data read from the drive.
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; typedef struct _IDSECTOR
{
USHORT wGenConfig;
USHORT wNumCyls;
USHORT wReserved;
USHORT wNumHeads;
USHORT wBytesPerTrack;
USHORT wBytesPerSector;
USHORT wSectorsPerTrack;
USHORT wVendorUnique[3];
CHAR sSerialNumber[20];
USHORT wBufferType;
USHORT wBufferSize;
USHORT wECCSize;
CHAR sFirmwareRev[8];
CHAR sModelNumber[40];
USHORT wMoreVendorUnique;
USHORT wDoubleWordIO;
USHORT wCapabilities;
USHORT wReserved1;
USHORT wPIOTiming;
USHORT wDMATiming;
USHORT wBS;
USHORT wNumCurrentCyls;
USHORT wNumCurrentHeads;
USHORT wNumCurrentSectorsPerTrack;
ULONG ulCurrentSectorCapacity;
USHORT wMultSectorStuff;
ULONG ulTotalAddressableSectors;
USHORT wSingleWordDMA;
USHORT wMultiWordDMA;
BYTE bReserved[128];
} IDSECTOR, *PIDSECTOR; VOID ChangeByteOrder(PCHAR szString, USHORT uscStrSize)
{
USHORT i;
CHAR temp; for (i = 0; i < uscStrSize; i+=2)
{
temp = szString[i];
szString[i] = szString[i+1];
szString[i+1] = temp;
}
}void StrToHex(char* s, CComBSTR& bstr)
{
int sLen = strlen(s);
char sTmp[3] = {NULL}; for (int i = 0; i < sLen; i ++)
{
sprintf(sTmp, "%x", s[i]);
bstr += sTmp;
}
}char* RTrim(char* s)
{
int sLen = strlen(s);
for (int i = 0; i < sLen; i ++)
{
if (isspace(s[sLen - i]))
s[sLen - i] = NULL;
} return s;
}STDMETHODIMP CHardwareID::GetCPUID(BSTR *bstrCPUID)
{
CComBSTR bstr("");
char szCPUID[129] = {NULL};
char szTmp[33] = {NULL};
unsigned long s1 = 0,
s2 = 0;
_asm
{
mov eax,01h
xor edx,edx
cpuid
mov s1,edx
mov s2,eax
}
sprintf(szTmp, "%08X%08X", s1, s2);
strcpy(szCPUID, szTmp);
_asm
{
mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
sprintf(szTmp, "%08X%08X", s1, s2);
strcat(szCPUID, szTmp);
bstr = szCPUID; *bstrCPUID = bstr.Copy(); return S_OK;
}STDMETHODIMP CHardwareID::GetHardDiskID(BSTR *bstrHardDiskID)
{
GETVERSIONOUTPARAMS vers;
SENDCMDINPARAMS in;
SENDCMDOUTPARAMS out;
HANDLE h;
DWORD i;
BYTE j; //char hd[80];
TCHAR hd[80];
PIDSECTOR phdinfo;
char s[41];
CComBSTR bstr(""); ZeroMemory(&vers,sizeof(vers));
for (j=0;j<4;j++)
{
//sprintf(hd,"\\\\.\\PhysicalDrive%d",j);
_tsprintf(hd, TEXT("\\\\.\\PhysicalDrive%d"),j);
h=CreateFile(hd,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if (!h)
{
continue;
}
if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0))
{
CloseHandle(h);
continue;
}
if (!(vers.fCapabilities & 1))
{
CloseHandle(h);
goto ErrHandle;
}
ZeroMemory(&in,sizeof(in));
ZeroMemory(&out,sizeof(out));
if (j & 1)
{
in.irDriveRegs.bDriveHeadReg=0xb0;
}
else
{
in.irDriveRegs.bDriveHeadReg=0xa0;
}
if (vers.fCapabilities & (16>>j))
{
continue;
}
else
{
in.irDriveRegs.bCommandReg=0xec;
}
in.bDriveNumber=j;
in.irDriveRegs.bSectorCountReg=1;
in.irDriveRegs.bSectorNumberReg=1;
in.cBufferSize=512;
if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0))
{
CloseHandle(h);
goto ErrHandle;
}
phdinfo=(PIDSECTOR)out.bBuffer;
memcpy(s,phdinfo->sModelNumber,40);
s[40]=0;
ChangeByteOrder(s,40);
memcpy(s,phdinfo->sFirmwareRev,8);
s[8]=0;
ChangeByteOrder(s,8);
memcpy(s,phdinfo->sSerialNumber,20);
s[20]=0;
ChangeByteOrder(RTrim(s),20);
//bstr = s;
StrToHex(s, bstr);
CloseHandle(h); break;
} ErrHandle:
*bstrHardDiskID = bstr.Copy(); return S_OK;
}STDMETHODIMP CHardwareID::GetNetworkCardID(BSTR *bstrNetworkCardID)
{
HMODULE hLib = LoadLibrary(TEXT("IPHLPAPI.DLL"));
PIP_ADAPTER_INFO piai = NULL;
ULONG ul = 0;
char sTmp[4] = {NULL};
CComBSTR bstr("");
typedef DWORD (WINAPI *pgai)(PIP_ADAPTER_INFO, PULONG); pgai p = (pgai)GetProcAddress(hLib, "GetAdaptersInfo");
p(piai, &ul);
piai = (PIP_ADAPTER_INFO)new BYTE[ul];
p(piai, &ul);
for (int i = 0; i < (int)piai->AddressLength; i ++)
{
if (i < (int)piai->AddressLength - 1)
sprintf(sTmp, "%02x-", piai->Address[i]);
else
sprintf(sTmp, "%02x", piai->Address[i]); bstr += sTmp;
} FreeLibrary(hLib); *bstrNetworkCardID = bstr.Copy(); return S_OK;
}
http://www.codeproject.com/system/change_drive_sn.asp
: 我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是
: 软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序
: 列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个
: api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所
: 以以读硬盘序列号为例,
: 下面就先介绍一下我们要用到的api函数
: BOOL GetVolumeInformation(
: LPCTSTR lpRootPathName, // 硬盘的路径
: LPTSTR lpVolumeNameBuffer, // 硬盘的卷标
: DWORD nVolumeNameSize, // 卷标的字符串长度
: LPDWORD lpVolumeSerialNumber, // 硬盘的序列号
: LPDWORD lpMaximumComponentLength, // 最大的文件长度
: LPDWORD lpFileSystemFlags, // 文件系统的一此标志
: LPTSTR lpFileSystemNameBuffer, // 存储所在盘符的分区类型的长指针变
: 量
: 量
: DWORD nFileSystemNameSize // 分区类型的长指针变量所指向的字符
: 串长度
: );
: 如果上述函数成功就返回一个非0值。
:
: 光说不做,是不行了,我们还得实践一下:// 最大的文件长度
: 首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,
: 点击finish。
: 加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码:
: LPCTSTR lpRootPathName="c:\\"; //取C盘
: LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标
: DWORD nVolumeNameSize=12;// 卷标的字符串长度
: DWORD VolumeSerialNumber;//硬盘序列号
: DWORD MaximumComponentLength;// 最大的文件长度
: LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的
: 长指针变量
: DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度
:
: DWORD FileSystemFlags;// 文件系统的一此标志
: ::GetVolumeInformation(lpRootPathName,
: lpVolumeNameBuffer, nVolumeNameSize,
: &VolumeSerialNumber, &MaximumComponentLength,
: &FileSystemFlags,
: lpFileSystemNameBuffer, nFileSystemNameSize);
:
: CString str;
: str.Format("Seria Num is %lx ",VolumeSerialNumber);
: AfxMessageBox(str);