4

Delphi で 32 ビット アプリケーションを作成する アプリケーションが win32 または win64 Windows マシンで実行されているかどうかに応じて、すべてのハイブにアクセスできません。デフォルト アクセスのリンクは次のとおりです: http://msdn.microsoft.com/en-us/library/aa390789(v=VS.85).aspx

32 と 64 用の個別のバージョンではなく、単一のアプリケーションを作成したいだけです。また、WMI を使用して、32 ビット レジストリ ハイブ、64 ビット レジストリ ハイブ、および WOW6432Node から情報を取得したいと考えています。設定する FLAGS がありますが、デルファイ アプリケーションからの通常の WMI クエリ呼び出しでフラグを送信する方法がわかりません。FLAG に関する情報は次のとおりです: http://msdn.microsoft.com/en-us/library/aa393067(v=VS.85).aspx

GLibWmi & DelphiWmiCodeCreator の例:

function GetWMIObject(const objectName: String): IDispatch; //create the Wmi instance
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;

procedure  GetWin32_StartupCommandInfo;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\CIMV2');
  colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_StartupCommand','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  while oEnum.Next(1, colItem, iValue) = 0 do
  begin
    Writeln('');
  end;
end;

改訂されたコード:

procedure  GetWin32_StartupCommandInfo(aIDispatch: IDispatch);
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  objWMIService := aIDispatch; //GetWMIObject('winmgmts:\\localhost\root\CIMV2');
  colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_StartupCommand','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  while oEnum.Next(1, colItem, iValue) = 0 do
  begin
    with Form1.lst1 do begin

      items.Add(Format('Caption="%s"; Location="%s"',[colItem.Caption,colItem.Location]));// String
      {items.Add(Format('Command         %s',[colItem.Command]));// String
      items.Add(Format('Description     %s',[colItem.Description]));// String
      items.Add(Format('Location        %s',[colItem.Location]));// String
      items.Add(Format('Name            %s',[colItem.Name]));// String
      items.Add(Format('SettingID       %s',[colItem.SettingID]));// String
      items.Add(Format('User            %s',[colItem.User]));// String
      items.Add(Format('UserSID         %s',[colItem.UserSID]));// String
      }
      items.Add('');

    end;
  end;
end;

function MyConnectWMI(wmiHost:string; var Services: ISWbemServices):Boolean;
const
  STR_CIM2_ROOT ='root\CIMV2';
  STR_EMPTY = '';
var
  NVS: SWbemNamedValueSet;
  providerArchitecture : OleVariant;
  requiredArchitecture : OleVariant;
  Locator : ISWbemLocator; //CoSWbemLocator;
begin
  try
    providerArchitecture := 32; // or 64
    requiredArchitecture := true;

    NVS := CoSWbemNamedValueSet.Create( );
    NVS.Add('__ProviderArchitecture', providerArchitecture , 0);
    NVS.Add('__RequiredArchitecture', requiredArchitecture , 0);
    // Create the Location object
    Locator := CoSWbemLocator.Create();
    // Connect to the WMI service, with the root\cimv2 namespace
    Services := Locator.ConnectServer(wmiHost,
        STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
        STR_EMPTY,STR_EMPTY, 0, NVS);

    Result := True;
  except
    Result := False;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  aServices: ISWbemServices;
begin
  if MyConnectWMI('localhost', aServices) then
    GetWin32_StartupCommandInfo(aServices);
end;
4

1 に答える 1

2

あなたは WMI モニカーを使用していますが、私が見る限り、それを介して必要なオプションを指定することはできません。代わりに SWbemLocator オブジェクトを使用する必要があります。これにより、最終パラメーターとして SWbemNamedValueSet を渡すことができます。

GLibWMI の UProcedures.pas ファイルに ConnectWMI 関数があります。最後のパラメーターに nil を渡します。

Services := Locator.ConnectServer(wmiHost,
        STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
        STR_EMPTY,STR_EMPTY, 0, nil);

次のような代替案を作成する必要があります。

var
    NVS: SWbemNamedValueSet;
    providerArchitecture : OleVariant;
    requiredArchitecture : OleVariant;
/////

    providerArchitecture := 32; // or 64
    requiredArchitecture := true;

    NVS := CoSWbemNamedValueSet.Create();
    NVS.Add('__ProviderArchitecture', providerArchitecture , 0); 
    NVS.Add('__RequiredArchitecture', requiredArchitecture , 0);

    // Create the Location object
    Locator := CoSWbemLocator.Create();
    // Connect to the WMI service, with the root\cimv2 namespace
    Services := Locator.ConnectServer(wmiHost,
        STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
        STR_EMPTY,STR_EMPTY, 0, NVS);

これにより、ExecQuery を実行できる ISWbemServices インターフェイスが取得されます。

StdRegProv 経由でレジストリにアクセスする -


procedure  Get_RegistryValue(aIDispatch: IDispatch);
var
  objWMIService : OLEVariant;

  strKeyPath : OLEVariant;
  strValue : OLEVariant;
  strOut : OLEVariant;

  objStdRegProv : OLEVariant;
begin;
  objWMIService := aIDispatch; 

  objStdRegProv := objWMIService.Get('StdRegProv');

  strKeyPath := 'Software\Microsoft\Wbem\CIMOM';
  strValue := 'Logging';

  objStdRegProv.GetStringValue(HKEY_LOCAL_MACHINE, strKeyPath, strValue, strOut);

    with Form1.lst1 do begin
      items.Add(strOut);
    end;
  end;
end;


// connect to root\default instead of cimv2
function MyConnectWMI(wmiHost:string; var Services: ISWbemServices):Boolean;
const
  STR_DEFAULT_ROOT = 'root\default'
  STR_EMPTY = '';
var
  NVS: SWbemNamedValueSet;
  providerArchitecture : OleVariant;
  requiredArchitecture : OleVariant;
  Locator : ISWbemLocator; //CoSWbemLocator;
begin
  try
    providerArchitecture := 32; // or 64
    requiredArchitecture := true;

    NVS := CoSWbemNamedValueSet.Create( );
    NVS.Add('__ProviderArchitecture', providerArchitecture , 0);
    NVS.Add('__RequiredArchitecture', requiredArchitecture , 0);
    // Create the Location object
    Locator := CoSWbemLocator.Create();
    // Connect to the WMI service, with the root\cimv2 namespace
    Services := Locator.ConnectServer(wmiHost,
        STR_DEFAULT_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
        STR_EMPTY,STR_EMPTY, 0, NVS);

    Result := True;
  except
    Result := False;
  end;
end;
于 2011-01-07T21:43:48.800 に答える