检查 CD 的序列号






2.60/5 (5投票s)
2001年12月27日

237907

2096
如果安装光盘不在光驱中,此程序将通过检查光盘的序列号弹出一个消息框。
引言
此程序检查 CD-ROM 的序列号,如果安装光盘不在光驱中,则拒绝运行。 此程序假定在安装时,安装光盘的序列号存储在注册表位置 HKEY_LOCAL_MACHINE\Software\CDsoft\Cds
。 我们可以通过在我们的安装程序中添加以下代码来实现这一点。
GetVolumeInformation(drive, vol, sizeof(vol), &sno, &mf, &sf, NULL,NULL); RegCreateKeyEx (HKEY_LOCAL_MACHINE, "Software\\CDsoft", 0, NULL,REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_ALL_ACCESS, NULL, &childkey, &dispos) ; RegSetValueEx ( childkey, "Cds", 0, REG_DWORD, ( const BYTE* )(LPDWORD) &sno, size) ; RegCloseKey ( childkey );
在 OnInitDialog
函数中,我们使用以下代码从注册表中读取安装光盘的序列号。 我们还启动了一个计时器。
HKEY hkeyresult ; DWORD size=sizeof(DWORD) ; DWORD type; BYTE sno[100]; RegOpenKey ( HKEY_LOCAL_MACHINE, ( LPCTSTR ) "Software\\CDsoft", &hkeyresult ); RegQueryValueEx ( hkeyresult, ( LPCTSTR )"Cds" , 0,&type, sno,&size); RegCloseKey ( hkeyresult ); serialnoCD=*(DWORD *)sno; SetTimer(NULL,1000,NULL);
在这个程序中,OnTimer 每秒调用一次 check
函数。 如果光盘不在驱动器中,此函数将显示一个 MessageBox
。 用于检查 CD-ROM 序列号的函数如下...
void CCDcheckDlg::Check() { char dbits[100],drive[100]; int i=0; DWORD d=GetLogicalDriveStrings(100, dbits); strncpy(drive,dbits+i,4); for (int nDrives = 0; nDrives < 26; nDrives ++) { if(GetDriveType(drive)==DRIVE_CDROM) break; i+=4; strncpy(drive,dbits+i,4); } char vol[40]; DWORD mf; DWORD sf,sno; GetVolumeInformation(drive, vol, sizeof(vol), &sno, &mf, &sf, NULL,NULL); int ret; //serialnoCD is the serial number of installation CD.. if (sno!=serialnoCD){ ret=MessageBox("To use this software CD Must be in the drive", "Sorry", MB_RETRYCANCEL|MB_ICONERROR|MB_APPLMODAL); } }
这只是一个想法,我不太了解软件盗版。 我听说序列号对于所有光盘都是唯一的,并且无法更改,但我不知道这是真的还是假的。 无论如何,我认为这种方法可以减少或降低盗版。 你怎么看?