2013-03-26 160 views
-1

我想显示Windows版本和产品详细信息的Vista操作系统使用GetProductInfo函数在Delphi XE2由一个Senoir成员建议。我已经定义了下面的代码,但我无法编译它。我的代码如下:Windows版本使用GetProductInfo

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Edit3: TEdit; 
    Edit4: TEdit; 
    Edit5: TEdit; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
type 
TGetProductInfoAPI = function(dwOSMajorVersion, dwOSMinorVersion, 
dwSpMajorVersion, dwSpMinorVersion: DWORD; pdwReturnedProductType: 
PDWORD): BOOL stdcall; 
begin 
    Edit1.Text:=IntToStr(dwOSMajorVersion); 
    Edit2.Text:=IntToStr(dwOSMinorVersion); 
    Edit3.Text:=IntToStr(dwSpMajorVersion); 
    Edit4.Text:=IntToStr(dwSpMinorVersion); 
    Edit5.Text:=TGetProductInfoAPI.pdwReturnedProductType; 
end; 

end. 

我想我正在犯一些错误,但我无法找到它。请告诉我我犯错的地方。

+1

根本不会调用函数。 – 2013-03-26 18:35:05

回答

2

kernel32.dll使用this function正确的方法是写

function GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, 
    dwSpMinorVersion: DWORD; out pdwReturnedProductType: DWORD): BOOL stdcall; 
    external kernel32 delayed; 

在一些单元

例如(任何过程,类型声明等之外),

function GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, 
    dwSpMinorVersion: DWORD; out pdwReturnedProductType: DWORD): BOOL stdcall; 
    external kernel32 delayed; 

const 
    PRODUCT_HOME_PREMIUM = $00000003; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    rpt: cardinal; 
begin 
    if GetProductInfo(6, 1, 0, 0, rpt) then 
    if rpt and PRODUCT_HOME_PREMIUM <> 0 then 
     ShowMessage('Yeah, you''re running Home Premium.'); 
end; 

如果你只是想看到返回的值,那就显示它吧!

procedure TForm1.Button2Click(Sender: TObject); 
var 
    rpt: cardinal; 
begin 
    if GetProductInfo(6, 1, 0, 0, rpt) then 
    ShowMessage(IntToStr(rpt)); 
end; 

而且,只是为了把事情说清楚:四个第一参数此功能是(显然)对输入,不是输出。如果你想获得操作系统的版本,你可以使用GetVersionEx或者简单地看看SysUtils中的变量Win32MajorVersion等。

+0

不,不!我的要求是只显示返回值。我会用我的方式编码它。请告诉我只显示返回值的过程 – 2013-03-26 18:49:22

+0

问题在于EXE不会在XP上加载。你想要一个版本检查'CheckWin32Version(6)'和'delayed'的使用。 – 2013-03-26 18:49:26

+0

@RubiHalder:你所需要的只是在我的回答中。 – 2013-03-26 18:49:59