Frage

mit delphi eine 32-Bit-Anwendung erstellen Ich habe keinen Zugriff auf alle Nesselsucht je nachdem, ob die Anwendung auf einem win32 oder win64 Windows-Rechner ausgeführt wird. Hier ist ein Link für Standardzugriff: http: // msdn.microsoft.com/en-us/library/aa390789(v=VS.85).aspx

Ich will nur eine einzige Anwendung erstellen, und nicht um eine separate Version für 32 & 64. Und ich möchte WMI verwenden und Informationen aus der 32-Bit-Registrierungsstruktur abzurufen, die 64-Bit-Registrierungsstruktur und der WOW6432Node. Es gibt FLAGS zu belegen, aber ich kann nicht herausfinden, wie die Flaggen mit einem regelmäßigen WMI-Abfrage Anruf von meiner delphi-Anwendung zu senden. Hier Informationen über das FLAGS: http: // msdn .microsoft.com / en-us / library / aa393067 (v = VS.85) aspx

GLibWmi & DelphiWmiCodeCreator exmple:

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;

REVISED Code:

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;
War es hilfreich?

Lösung

Sie verwenden einen WMI-Moniker und soweit ich sehen kann man nicht die Optionen festlegen, können Sie über diese benötigen. Sie müssen das SWbemLocator Objekt verwenden, anstatt wie wollen sie Ihnen die SWbemNamedValueSet als letzten Parameter.

Es gibt eine ConnectWMI Funktion in der UProcedures.pas Datei von GLibWMI. Es geht eine Null an den letzten Parm:

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

Sie brauchen eine Alternative zu schaffen, so etwas wie folgt aus:

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);

Das wird Ihnen eine ISWbemServices bekommen Schnittstelle, auf der Sie dann ExecQuery ausführen.

Zugriff auf die Registrierung über 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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top