-1

GetProductInfoSenoir メンバーの 1 人が提案したように、Delphi XE2 の Function を使用して、Vista 以降の OS の Windows バージョンと製品詳細を表示しようとしています。次のコードを定義しましたが、コンパイルできません。私のコードは次のとおりです:

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.

私はいくつかの間違いをしていると思いますが、それを見つけることができません。どこが間違っているのか教えてください。

4

1 に答える 1

2

この関数を使用する正しい方法kernel32.dllは、次のように書くことです。

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;

また、明確にするために: この関数の最初の 4 つの引数は (明らかに) input用であり、 output用ではありません。OS のバージョンを取得したい場合は、 の変数などを使用するGetVersionExか、単に見ることができます。Win32MajorVersionSysUtils

于 2013-03-26T18:38:42.947 に答える