2013-03-26 60 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