Toon posts:

[Delphi] bepalen of WMI op host enabled is

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allen,

Ik heb een procedure geschreven om data te verkrijgen van het WMI interface van een remotecomputer. Deze procedure is onderdeel van een hele reeks. Probleem doet zich nu echter voor wanneer de remotehost geen WMI service heeft draaien. Dan kan ie dus niet verbinden en knalt de hele procedure eruit met de melding: "RPC server unavailable". Dit is de code die ik heb geschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Procedure TForm1.Getinfo (WMI_Interface: String);
Var
  Locator       : ISWbemLocator;
  Services      : ISWbemServices;
  ObjectSet     : SWbemObjectSet;
  Enum          : IEnumVARIANT;
  TempObj       : OleVariant;
  Value         : Cardinal;
  SObject       : ISWbemObject;
begin
MyResults := TStringlist.Create;
Locator := CoSWbemLocator.Create;
services:=locator.connectserver(Computername2,'','','','','',0, nil);
sObject:= services.Get(WMI_Interface, wbemFlagUseAmendedQualifiers, nil);
ObjectSet:= SObject.Instances_(0, nil);
  Enum:= (ObjectSet._NewEnum) as IEnumVariant;
  while (Enum.Next(1, TempObj, Value) = S_OK) do
  begin
    SObject:= IUnknown(TempObj) as SWBemObject;
   if WMI_Interface = 'Win32_Processor' then
    begin
      MyResults.Text := SObject.GetObjectText_(0);
      GetInfoBool := True;
    end;
    CPUInfo := SObject.GetObjectText_(0);
  end;
  if WMI_Interface = 'Win32_ComputerSystem' then myResults.Text := SObject.GetObjectText_(0);
end;


Weet iemand hoe ik voorkom dat de hele procedure eruit knalt als de bovenstaande procedure eruit knalt? OnExeption??

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Kun je niet iets doen met :? :
Delphi:
1
2
3
4
5
try
  ...
except
  ...
end;

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

Daar kom je achter met debuggen. Zet een breakpoint op regel 11 en loop met de debugger vervolgens regel voor regel door de code. Dan merk je vanzelf welke regel een exception veroorzaakt. Vervolgens kun je de fout desnoods afvangen met een try..except blok en er adequaat op reageren. Los daarvan begrijp ik de hele procedure niet - wat doet regel 18 op die plaats?

Je creëert trouwens lokaal een TStringList die MyResults heet en waarschijnlijk een globale variabele is. Dat is heel gevaarlijk. Als je per ongeluk voor de tweede keer de procedure GetInfo aanroept zonder dat je tussentijds de eerste TStringList hebt vrijgegeven, heb je een geheugenlek. Sterker nog: als je MyResults niet vrijgeeft hebt je sowieso een geheugenlek.

Dit is een nettere een veiligere oplossing om een geheugenlek te voorkomen:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure TForm1.GetInfo(Info: TStrings; const WMI_Interface: string);
var
  Locator: ISWbemLocator;
  Services: ISWbemServices;
  ObjectSet: SWbemObjectSet;
  Enum: IEnumVariant;
  TempObj: OleVariant;
  Value: Cardinal;
  SObject: ISWbemObject;
begin
  Locator := CoSWbemLocator.Create;
  Services := Locator.connectserver(Computername2, '', '', '', '', '',
    0, nil);
  SObject := Services.Get(WMI_Interface, wbemFlagUseAmendedQualifiers,
    nil);
  ObjectSet := SObject.Instances_(0, nil);
  Enum:= (ObjectSet._NewEnum) as IEnumVariant;
  while Enum.Next(1, TempObj, Value) = S_OK do
  begin
    SObject := IUnknown(TempObj) as SWBemObject;
    if WMI_Interface = 'Win32_Processor' then
    begin
      Info.Text := SObject.GetObjectText_(0);
      GetInfoBool := True;
    end;
    CPUInfo := SObject.GetObjectText_(0);
  end;
  if WMI_Interface = 'Win32_ComputerSystem' then
    Info.Text := SObject.GetObjectText_(0);
end;

procedure TForm1.IkWilInfoHebben;
var
  MyResults: TStrings;
begin
  MyResults := TStringList.Create;
  try
    GetInfo(MyResults, 'blabla-interface');
    ShowMessage(MyResults.Text); // doe wat met MyResults
  finally
    MyResults.Free;
  end;
end;
Als je trouwens netjes inspringt en consequent bent in spaties en hoofdlettergebruik, wordt de code met heel weinig moeite een stuk beter leesbaar. Ook duidelijk commentaar toevoegen kan helpen (bijvoorbeeld om mij op weg te helpen :)).

[ Voor 27% gewijzigd door Tomatoman op 11-06-2004 19:23 ]

Een goede grap mag vrienden kosten.