65.9K
CodeProject 正在变化。 阅读更多。
Home

检查 CD 的序列号

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.60/5 (5投票s)

2001年12月27日

viewsIcon

237907

downloadIcon

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);    
    }
}

这只是一个想法,我不太了解软件盗版。 我听说序列号对于所有光盘都是唯一的,并且无法更改,但我不知道这是真的还是假的。 无论如何,我认为这种方法可以减少或降低盗版。 你怎么看?

© . All rights reserved.