2013-03-28 2 views
-4

У меня есть проект для отображения версии Windows с типом строки издания с Windows 95 на «Windows 8» с использованием Delphi XE2. Во-первых, я попробовал функцию «TOSVersion». Но проблема в том: „Тогда я ahve попробовал„Версия для Windows с выпуском

procedure TMainForm.BitBtn01Click(Sender: TObject); 
var 
    VersionNameOfOperatingSystem : String; 
begin 
    VersionNameOfOperatingSystem := TOSVersion.Name; 
    Edit01.Text := VersionNameOfOperatingSystem; 
end 

показывает только «Windows» в Windows 8 окружающей среды»и еще одна проблема в том, что Ii не может обнаружить“ Windows Edition, функция GetProductInfo“Но здесь другая проблема :

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

procedure TMainForm.BitBtn01Click(Sender: TObject); 
var 
rpt: cardinal; 
begin 
    if GetProductInfo(6, 0, 0, 0, @rpt) then Edit02.Text :=IntToStr(rpt); 
end 

и

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

procedure TMainForm.BitBtn01Click(Sender: TObject); 
var 
rpt: cardinal; 
begin 
    if GetProductInfo(6, 1, 0, 0, @rpt) then Edit02.Text :=IntToStr(rpt); 
end 

и

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

procedure TMainForm.BitBtn01Click(Sender: TObject); 
var 
rpt: cardinal; 
begin 
    if GetProductInfo(6, 2, 0, 0, @rpt) then Edit02.Text :=IntToStr(rpt); 
end 

и

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

procedure TMainForm.BitBtn01Click(Sender: TObject); 
var 
rpt: cardinal; 
begin 
    if GetProductInfo(6, 2, 2, 2, @rpt) then Edit02.Text :=IntToStr(rpt); 
end 

производит тот же результат, если я бегу скомпилированный исполняемый файл в Windows Vista Enterprise SP2 и то же самое не может быть использована более ранней версии Windows. Если я называю «TOSVersion» следующим

begin 
    TOSVersion.Platform of 
    pfWindows : 
     begin 
     . 
     . 
     . 
     . 
     end 
    else 
     beging 
     . 
     . 
     . 
     end 
end; 

и вызов «GetProductInfo», то я получаю «Ошибка» Показательно, что оба не могут назвать одновременно в нуль. Наконец-то я попробовал «Структура OSVERSIONINFO», чтобы определить, является ли это «Сервер» или нет, и «Функция GetVersionEx» для «Тип Windows XP Edition». Я совершенно смущен, как начать программирование. На этом форуме так много опытных кодеров. Любой может записать полную программу. Я googled, но все доступные программы до «Windows 7» не обновляются. И один доступный на этом форуме также относится к «Windows 7» и не обновляется. Пожалуйста, не говорите: «Мы не можем сидеть на вашей клавиатуре и вводить код для вас». Пожалуйста, помогите мне.

+0

Вы просите нас написать полную программу для решения вашей конкретной проблемы. Это само определение слишком локализованного вопроса. Вся информация содержится в других ваших недавних вопросах. –

+0

Снова я пробовал код Кена, и я получаю ошибку как «[Предупреждение DCC] Unit1.pas (148): W1036 Переменная 'dwOSMajorVersion', возможно, не была инициализирована« »[Предупреждение DCC] Unit1.pas (148): W1036 Переменная 'dwOSMinorVersion', возможно, не была инициализирована " " [Предупреждение DCC] Unit1.pas (148): W1036 Переменная 'dwSpMajorVersion', возможно, не была инициализирована " " [Предупреждение DCC] Unit1.pas (148): W1036 Variable ' dwSpMinorVersion ', возможно, не было инициализировано ". Но я также не могу показать строку «Результат» и «tmpStr». Если я определяю «Edit1.Text: = Result» и Edit2.Text: = tmpStr; дает ошибку. –

+0

ОК, я попытался скомпилировать код Кена, он не компилируется, он плохой. Вот версия, которая компилируется. Я не тестировал его полностью: http://pastebin.com/RZd1Ag4u –

ответ

2

Мне кажется, что все последние вопросы были связаны со следующей задачей:

  1. Вы хотите получить полное наименование продукта операционной системы. Различные примеры кода, которые вы пробовали, имеют недостатки. Например, многие из проб, которые вы пробовали, не распознают Windows 8.
  2. Вы хотите узнать тип продукта. Вы хотите определить выпуски Ultimate.

Я предлагаю вам использовать WMI для этого. Это будет в будущем доказательство вашего кода, чтобы он работал на еще неизданных версиях Windows.

Для моего кода WMI, я беззастенчиво повторно использовать код в WMI экспертного RRUZ от этого ответа: How do I use WMI with Delphi without drastically increasing the application's file size?

unit SimpleWMI; 

interface 

uses 
    SysUtils, ActiveX, ComObj, Variants; 

function GetWMIprops(const wmiHost, root, wmiClass: string; const wmiProps: array of string): TArray<string>; 

implementation 

function GetWMIprops(const wmiHost, root, wmiClass: string; const wmiProps: array of string): TArray<string>; 
var 
    objWMIService: OLEVariant; 
    colItems: OLEVariant; 
    colItem: OLEVariant; 
    oEnum: IEnumvariant; 
    iValue: LongWord; 

    function GetWMIObject(const objectName: String): IDispatch; 
    var 
    chEaten: Integer; 
    BindCtx: IBindCtx; 
    Moniker: IMoniker; 
    begin 
    OleCheck(CreateBindCtx(0, BindCtx)); 
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); 
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); 
    end; 

var 
    i: Integer; 

begin 
    objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s', [wmiHost, root])); 
    colItems := objWMIService.ExecQuery(Format('SELECT * FROM %s', [wmiClass]), 'WQL', 0); 
    oEnum := IUnknown(colItems._NewEnum) as IEnumvariant; 
    SetLength(Result, Length(wmiProps)); 
    while oEnum.Next(1, colItem, iValue) = 0 do 
    for i := 0 to high(wmiProps) do 
     Result[i] := colItem.Properties_.Item(wmiProps[i], 0); 
end; 

end. 

Итак, теперь вы можете решить вашу проблему с этой простой программы:

program OSVersionDemo; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Windows, 
    ActiveX, 
    SimpleWMI in 'SimpleWMI.pas'; 

function IsUltimateEdition(ProductType: DWORD): Boolean; 
begin 
    Result := ProductType in [PRODUCT_ULTIMATE,PRODUCT_ULTIMATE_N,PRODUCT_ULTIMATE_E]; 
end; 

var 
    PropValues: TArray<string>; 
    ProductType: DWORD; 

begin 
    CoInitialize(nil); 
    try 
    PropValues := GetWMIprops('.', 'root\CIMV2', 'Win32_OperatingSystem', ['Caption', 'Version', 'OperatingSystemSKU']); 
    Writeln('OS Name: ' + PropValues[0]); 
    Writeln('Version: ' + PropValues[1]); 
    ProductType := StrToInt(PropValues[2]); 
    Writeln('Ultimate edition: ' + BoolToStr(IsUltimateEdition(ProductType), True)); 

    Readln; 
    finally 
    CoUninitialize; 
    end; 
end. 

На моей машине мощность составляет:

 
OS Name: Microsoft Windows 7 Professional 
Version: 6.1.7601 
Ultimate edition: False 

Класс Win32_OperatingSystem имеет загружает дополнительную информацию. Поэтому, если вы хотите получить информацию о пакете обновления, запросите свойство CSDVersion.Например:

PropValues := GetWMIprops('.', 'root\CIMV2', 'Win32_OperatingSystem', ['Caption', 'Version', 'OperatingSystemSKU', 'CSDVersion']); 
Writeln('OS Name: ' + Trim(PropValues[0]) + ' ' + Trim(PropValues[3])); 
Writeln('Version: ' + PropValues[1]); 
ProductType := StrToInt(PropValues[2]); 
Writeln('Ultimate edition: ' + BoolToStr(IsUltimateEdition(ProductType), True)); 

Надеюсь, это даст вам достаточно информации, чтобы вы могли заполнить то, что вам действительно нужно для вашей проблемы.

Хотя вы говорите, что хотите поддерживать Windows 95, 98 и ME, имейте в виду, что программы, созданные с помощью Unicode-версий Delphi (например, XE2), не работают на этих древних системах.

Смежные вопросы