用api函式讀取硬碟的序列號 (轉)

worldblog發表於2007-12-09
用api函式讀取硬碟的序列號 (轉)[@more@]

用讀取的序列號

在寫時我們想對每一臺都生成一個唯一的標識,而且在一此共享中我們也看到,軟體在不同的機器上生成了不同的標識,這是如何實現的呢,其實是軟體有一部分程式讀取了,本地計算機的一部分引數(如硬碟序列號,序列號等等),再透過一系列演算法而得到了一個唯一標識,其實我們也可以透過一個api函式生成我們的唯一標識,由於硬碟人人都有,而網路卡不一定每個人都有,所以以讀硬碟序列號為例,
下面就先介紹一下我們要用到的api函式
 BOOL GetVolumeInformation(
  LPCTSTR lpPathName,  // 硬碟的路徑
  LPTSTR lpVolumeNameBuffer,  // 硬碟的卷標
  D 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);
 
編譯,連結並執行程式,單擊按鈕,在彈出的對話方塊中就是我們要的序列號。
對不對我們驗證一下,進入dos視窗,打入"dir c:/p"命令,怎麼樣是不是和我們的程式顯示的一模一樣
這樣我們就在功告成了。

 


 
 E:sunyuzhe@263
 主頁:
 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990632/,如需轉載,請註明出處,否則將追究法律責任。

相關文章