AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Über Wmi Netzwerk Status auslesen - Multithreaded
Thema durchsuchen
Ansicht
Themen-Optionen

Über Wmi Netzwerk Status auslesen - Multithreaded

Ein Thema von Highttower · begonnen am 3. Jun 2009 · letzter Beitrag vom 3. Jun 2009
Antwort Antwort
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, 10: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
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Über Wmi Netzwerk Status auslesen - Multithreaded

  Alt 3. Jun 2009, 10:16
Die Fehlermeldung bringt doch schon die Lösung:

Mein Glaskugel sagt etwas von "CoInitialize nicht aufgerufen" ...

Ein Suche nach CoInitialize bringt dir viele Threads die das gleiche Problem bei Threads hatten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Highttower

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

Re: Über Wmi Netzwerk Status auslesen - Multithreaded

  Alt 3. Jun 2009, 10:26
gnar ...

Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle. Ich frage zuerst Google bevor ich dumme Fragen stelle.

Vielen lieben dank und ein ganz großes Entschuldigung
Tobi
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Über Wmi Netzwerk Status auslesen - Multithreaded

  Alt 3. Jun 2009, 10:28
Zitat von Highttower:
Vielen lieben dank und ein ganz großes Entschuldigung
Kein Problem. Du bist ja nicht der einzige der hier herein gefallen ist.

Und übrigens: Herzlich willkommen in der Delphi-Praxis.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz