Einzelnen Beitrag anzeigen

Highttower

Registriert seit: 2. Jun 2009
Ort: Worms
88 Beiträge
 
Delphi 2010 Professional
 
#1

Über Wmi Netzwerk Status auslesen - Multithreaded

  Alt 3. Jun 2009, 09:10
Hallo zusammen,
ich hab mir den Code von Phoenix zum "MAC Adresse(n) des Rechners via WMI ermitteln" (http://www.delphipraxis.net/internal...ct.php?t=24332), etwas umgebaut, so das ich damit nur den Status der Netzwerkverbindung und den Namen auslese. Das funktioniert auch alles wunderbar, vielen dank dafür =). Aber sobald ich mit einem anderen Thread als dem Mainthread darüber rausche wird der Constructor "CoSWbemLocator.Create: ISWbemLocator" in der WMI nicht mehr gerufen, und eine Exeception fliegt. Vermutlich hab ich nur irgendwas kleines übersehn....

Delphi-Quellcode:
function getSystemMACAddresses: TStringList;
var
   l_WMILocator: ISWbemLocator; // Locator, gets Services
   l_WMIServices: ISWbemServices; // Services, gets Object Definitions
   l_WMIObjectDefinition: ISWbemObject; // Definition, gets Set of Objetcs
   l_WMIObjectSet: SWbemObjectSet; // ObjectSet, gets Enum over Instances
   l_WMIObjectInstances: IEnumVariant; // Enum of Instances, gets Object
   l_WMIObject: ISWbemObject; // Object, gets Sets of his properties
   l_WMIPropertySet: ISWbemPropertySet; // PropertySet, gets single property
   l_WMIProperty: ISWbemProperty; // Property, gets Value

   l_TempObj: OleVariant; // temporary used values
   l_ObjValue: Cardinal;
begin
 EnterCriticalSection(Guard);
    try
        result := TStringList.Create;
        // retrieve object enum through WMI classes
        l_WMILocator := CoSWbemLocator.Create; // <- CRASH ... aber nur mit MultiThread, a
                                                    //aber die komplette funktion ist ja geguardet
        l_WMIServices := L_WMILocator.ConnectServer(WMI_LOCAL_COMPUTER, WMI_SYSTEM_NAMESPACE, '', '', '', '', 0, nil);
        l_WMIObjectDefinition := l_WMIServices.Get(WMI_CLASS_NIC, wbemFlagUseAmendedQualifiers, nil);
        l_WMIObjectSet := l_WMIObjectDefinition.Instances_(0, nil);
        l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant;

        // iterate through enum values (WbemObjects) and get the property values
        while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do
        begin

            // retrieve object enum through WMI classes
            l_WMILocator := CoSWbemLocator.Create;
            l_WMIServices := L_WMILocator.ConnectServer(WMI_LOCAL_COMPUTER, WMI_SYSTEM_NAMESPACE, '', '', '', '', 0, nil);
            l_WMIObjectDefinition := l_WMIServices.Get(WMI_CLASS_NIC, wbemFlagUseAmendedQualifiers, nil);
            l_WMIObjectSet := l_WMIObjectDefinition.Instances_(0, nil);
            l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant;

            // iterate through enum values (WbemObjects) and get the property values
            while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do
            begin
                l_WMIObject:= IUnknown(l_TempObj) as SWBemObject;

                l_WMIPropertySet := l_WMIObject.Properties_;

                l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_AVAILAB, 0);
                if not VarIsNull(l_WMIProperty.Get_Value) then
                begin
                    Result.Add(l_WMIProperty.Get_Value);
                    l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_CONNSTAT, 0);
                    if l_WMIProperty.Get_Value=2 then begin
                        result.Add('C');
                    end
                    else
                        result.Add('N');
                end;
            end;
        end;
    finally
        LeaveCriticalSection(Guard);
    end;
end;
Hat jemand ne Ahnung was da Schief läuft?
Achja, ich hab noch nicht viel Ahnung von Delphi, ich bin von C++ hier her umgestiegen.

Vielen Dank,

Highttower
Tobi
  Mit Zitat antworten Zitat