把 NSIS 插件 CPUDesc 移植到 Inno Setup 使用

引用来自  cpudesc.iss,2008-7-11 22:05:45 引用来自 cpudesc.iss,2008-7-11 22:05:45
; -- cpudesc.iss --
; restools
; http://restools.hanzify.org
; cpudesc.dll 为一个用于 Inno Setup 的 6 KB 的 CPU 参数检测插件。

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon=
Compression=lzma
SolidCompression=yes
OutputDir=.

[Files]
Source: "cpudesc.dll"; Flags: dontcopy

[code]
function cpu_intelp: integer; external 'cpu_intelp@files:cpudesc.dll stdcall';
//Intel CPU 型号:
//  0:    不是 Intel CPU (或者是非常旧的型号).
//  1:    Pentium 或者 Pentium MMX.
//        如果你想知道 CPU 的 MMX 支持, 可以使用 cpu_mmx 函数来检查.
//  2:    Pentium Pro, II 或者 Celeron.
//        (可能有,也可能没有 MMX,使用 cpu_mmx 函数来检查)
//  3:    Pentium III 或者 P3 (旧) Xeon. (带 MMX 和 SSE.)
//  4:    Pentium IV 或者 (新) Xeon. (带 MMX, SSE 和 SSE2.)

function cpu_amd: integer; external 'cpu_amd@files:cpudesc.dll stdcall';
//  第1字母标识为返回值右移8位得到字符(chr(cpu_amd shr 8)), 后数值标志为返回值的最低字节(cpu_amd and $FF)
//  为获得以下格式的返回值, 使用下面的例子中所用算法得出.
//  000:  不是 AMD CPU (或者是非常旧的型号).
//  Kdd:  旧的 K-系列.   "dd" 例如 05 代表 K5 或者 06 代表 K6.
//        (Pentium 兼容.   K5s 无 MMX 或者 3DNOW.   K6s 支持 MMX,
//        及后型号都是基于 3DNOW.)
//  Add:  AMD Athlon 或者 Duron.   "dd" 型号代码 (从 01 到 10).
//        (Pentium II 兼容. 支持扩展 MMX and 扩展 3DNOW. 无 SSE.)
//  Odd:  AMD Opteron.   "dd" 型号代码.
//        (Pentium IV 兼容. 这类 CPU 应该支持这个插件中能够检测到的这些功能.)

function cpu_ppro: integer; external 'cpu_ppro@files:cpudesc.dll stdcall';
//  0:    不兼容 Intel Pentium Pro 处理器.
//  1:    兼容 Intel Pentium Pro 处理器.

function cpu_mmx: integer; external 'cpu_mmx@files:cpudesc.dll stdcall';
//  0:    不支持 MMX.
//  1:    支持标准的 Intel MMX.
//  2:    支持标准的 MMX 和 扩展的 AMD MMX.

function cpu_sse: integer; external 'cpu_sse@files:cpudesc.dll stdcall';
//  0:    不支持 SSE.
//  1:    支持 SSE (Intel's Streaming SIMD extensions, P3-style).

function cpu_sse2: integer; external 'cpu_sse2@files:cpudesc.dll stdcall';
//  0:    不支持 SSE2.
//  1:    支持 SSE2 (Intel's Streaming SIMD extensions 2, P4-style).

function cpu_3dnow: integer; external 'cpu_3dnow@files:cpudesc.dll stdcall';
//  0:    不支持 3DNOW.
//  1:    支持标准的 AMD 3DNOW.
//  2:    支持标准的 AMD 3DNOW 和扩展的 AMD 3DNOW.

function cpu_arch: integer; external 'cpu_arch@files:cpudesc.dll stdcall';
//  00:   32-bit Intel or compatible
//  01:   MIPS (did NT 3.5, apparently)
//  02:   DEC Alpha.   (Yes, DEC.   I can't bring myself to call it COMPAQ.)
//  03:   PowerPC
//  04:   SHX (?)
//  05:   ARM (Acorn Risc Machine, I presume.   Running Windows?)
//  06:   64-bit Intel.
//  07:   64-bit Alpha
//  08:   MSIL (?)
//  09:   64-bit AMD
//  10:   32-bit Intel doing Win64 (?)

function cpu_level: integer; external 'cpu_level@files:cpudesc.dll stdcall';
// "Processor level", like what you see in the main processor environment
//        variable.   Sort-of useless for Intel architecture.

function cpu_ncpu: integer; external 'cpu_ncpu@files:cpudesc.dll stdcall';
//CPU数量 (或者核的数量)

function cpu_mhz: integer; external 'cpu_mhz@files:cpudesc.dll stdcall';
//CPU频率, 单位: MHz (大约数,有些微波动,一般在个位数上波动)

function cpu_ram: integer; external 'cpu_ram@files:cpudesc.dll stdcall';
//物理内存大小, 单位: MB


procedure InitializeWizard();
var
  
s: string;
  amd_val: Integer;
  cpu_amd_h, cpu_amd_l: string;
begin
  
amd_val := cpu_amd;
  cpu_amd_h := chr(amd_val shr 8);        // 字母标志
  
cpu_amd_l := inttostr(cpu_amd and $FF); // 型号
  
if length(cpu_amd_l) = 1 then cpu_amd_l := '0' + cpu_amd_l;

  s := 'INTELP=' + inttostr(cpu_intelp) + ' ' +
       'AMD=' + cpu_amd_h + cpu_amd_l + ' ' + // 1个字母 + dd 两位数值
      
'PPRO=' + inttostr(cpu_ppro) + ' ' +
       'MMX=' + inttostr(cpu_mmx) + ' ' +
       'SSE=' + inttostr(cpu_sse) + ' ' +
       'SSE2=' + inttostr(cpu_sse2) + ' ' +
       '3DNOW=' + inttostr(cpu_3dnow) + ' ' +
       'ARCH=' + inttostr(cpu_arch) + ' ' +
       'LEVEL=' + inttostr(cpu_level) + ' ' +
       'NCPU=' + inttostr(cpu_ncpu) + ' ' +
       'MHZ=' + inttostr(cpu_mhz) + ' ' +
       'RAM=' + inttostr(cpu_ram);
  msgbox(s, mbInformation, MB_OK);
end;

点击下面连接下载例子。
http://restools.hanzify.org/inno/cpudesc/inno_cpudesc.zip



评论: 8 | 引用: 0 | 查看次数: 8493
  • 1
ak [2008-07-17 10:30 PM]
引用内容 引用内容
此插件移植到此为止,该插件只能用于 Intel 和 AMD 的 CPU,而且检测并不全面,所以没有提升它的必要了,我找到了比较全面的 CPUID 描述文章,有空我自己再重新写一个吧。
你连同 其他参数(MMX, SSE2, NCPU, ARCH 等等) 一并作为判断条件吧,估计可以把错误率降低。

MMX, SSE2, NCPU可以正确判断,但ARCH却无法正确判断,即无法判是否支持64BIT,在core2上是0,但是core2 E4500肯定是支持64位的,所以这就有些麻烦了,仅根据这几个参数是无法综合判断的,比如同为2.4G的PD2.4与core2 E4500 (2.4G),MMX, SSE2, NCPU  这几个参数是完全一样的,ARCH 却无法得出,无法正确判断出二者来,但是二者的性能差别不是一点点的。希望xin还是抽空补充完善一下
xin [2008-07-15 09:32 PM]
引用来自 WLDNA 引用来自 WLDNA
呵呵,这个看起来不错的,不过,想冒昧的问个问题,
有没有可以检测cpu是MOBLIE的呢?
另外,有没有针对硬盘的插件呢?可以检测活动分区等的信息的呢?
谢谢了,

这个插件如果只提供一个完整 CPUID 的话就可以自己根据判断,因为对于同一类的 CPU ,它的 CPUID 是一致的。但是这个插件添加了自己的分类判断,所以导致并未能分清所有明细的类别。不过仅提供 CPUID 需要自己测试不同 CPU 之间的差别,并不利于插件的简单使用。
检测硬盘基于NT架构可以不用驱动,但在 9x 系统中需要用驱动辅助。
xin [2008-07-15 09:25 PM]
此插件移植到此为止,该插件只能用于 Intel 和 AMD 的 CPU,而且检测并不全面,所以没有提升它的必要了,我找到了比较全面的 CPUID 描述文章,有空我自己再重新写一个吧。
你连同 其他参数(MMX, SSE2, NCPU, ARCH 等等) 一并作为判断条件吧,估计可以把错误率降低。
ww [2008-07-15 09:03 PM]
谢作者的移置,发现一个问题,此插件写于2003年,对于2003年后的CPU不支持,比如酷睿就被认为是P3,连P4都不如,希望你能修正下。
ak [2008-07-15 03:11 PM]
我的原想法见:
www.dreams8.com/viewthread.php?tid=5564&pid=17395&page=1&extra=page%3D1#pid17395

如何Inno中根据检测目标安装机器的硬件性能默认安装不同的组件?
ak [2008-07-15 03:03 PM]
强悍,刚才没仔细看,下了一测试才发现,原来连内存的大小也能检测了
ak [2008-07-15 02:48 PM]
太好了,刚好正在找一个能在inno中检测系统信息的东东,这个是检测CPU的,请问可有检测内存的?
WLDNA [2008-07-14 09:57 AM]
呵呵,这个看起来不错的,不过,想冒昧的问个问题,
有没有可以检测cpu是MOBLIE的呢?
另外,有没有针对硬盘的插件呢?可以检测活动分区等的信息的呢?
谢谢了,
  • 1
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭