ybwen:
winnt4.0 sp5
c++ builder 4.0,installshield
我在制作安装程序时,想生成一个安装序列号,请问序列号一般是以什么为基础生成的,使用的是什么算法?
这并没有一个统一的算法,一般可以根据个人喜好。绝大多数安装序列号都与用户的硬盘分区序列号有关(QA000894 "如何调用GetVolumeInformation获得磁盘序列号")。也有的安装程序还检查CPU类型(比如将486定为1,Pentium定为2等等)、网卡等。然后,对得到的这些序号进行一些算术运算或字符变换。下面是某软件的序列号产生程序。
char sTable[]="XR4JYW95G7K26L3Q";
// Get volume serial number
GetVolumeInformation( "c://", (LPSTR)NULL, 0,
&dwVolumeSerialNumber, &dwDummy1,
&dwDummy2, (LPSTR)NULL, 0);
// Caculate the serial number
dwVolumeSerialNumber2 = (dwVolumeSerialNumber & 0xff)
^ (dwVolumeSerialNumber >> 8);
sCode[7] = sTable[(dwVolumeSerialNumber2 >> 20) ^ 1];
sCode[5] = sTable[(dwVolumeSerialNumber2 >> 16 & 0xf) ^ 1];
sCode[12] = sTable[(dwVolumeSerialNumber2 >> 12 & 0xf) ^ 1];
sCode[6] = sTable[(dwVolumeSerialNumber2 >> 8 & 0xf) ^ 7];
sCode[9] = sTable[(dwVolumeSerialNumber2 >> 4 & 0xf) ^ 7];
sCode[8] = sTable[(dwVolumeSerialNumber2 & 0xf) ^ 7];
sCode[13] = sTable[(dwVolumeSerialNumber2 >> 20) ^ 1
^ (dwVolumeSerialNumber2 & 0xf) ^ 7];
sCode[14] = sTable[(dwVolumeSerialNumber2 >> 20) ^ 1
^ (dwVolumeSerialNumber2 & 0xf) ^ 7 ^ 0xb];
wsprintf(sBuff, "Disk serial number: %x-%x/r/n"
"Sorbet serial number: %s",
HIWORD(dwVolumeSerialNumber),
LOWORD(dwVolumeSerialNumber),
sCode);
SetDlgItemText(hwndDlg, IDC_MSG, sBuff);
此问题由李海回答。
A回答: