WMI direkt mit PB?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
TheM4st0r
Beiträge: 11
Registriert: 29.03.2005 21:06
Wohnort: Hamburg <- Zentrum des Universums
Kontaktdaten:

Beitrag von TheM4st0r »

das problem is, das besagte funktion eben keinen zeiger auf nen string sondern auf ne structur des Typs Variant erwartet.
_______________________________________
C++ ruleZ the World
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Seit wann ist das jetzt ne Strucuture? eben wars noch ne Variable.
Benutzeravatar
TheM4st0r
Beiträge: 11
Registriert: 29.03.2005 21:06
Wohnort: Hamburg <- Zentrum des Universums
Kontaktdaten:

Beitrag von TheM4st0r »

VARIANT is ne structure, die mehrere variablen enthält. wir brauchen zwar nur einen string davon, trotzdem kann man den der funktion eben nich als paramter übergeben, wiel die eben gerne die dumme structur hätte...
_______________________________________
C++ ruleZ the World
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

*habichmirdasdochgedacht*

Soo, und nu? Wie muss ich denn die structur aufbauen?
Kann es sein das der ganze Block

Code: Alles auswählen

VARIANT vtProp;
        VariantInit(&vtProp);
        hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
        wcout << " OS Name : " << vtProp.bstrVal << endl;
VariantClear(&vtProp); 
die Struktur ist ?
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Kann es sein das der ganze Block

Code: Alles auswählen

VARIANT vtProp; 
        VariantInit(&vtProp); 
        hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); 
        wcout << " OS Name : " << vtProp.bstrVal << endl; 
VariantClear(&vtProp); 	
die Struktur ist ?
Hmm, das glaub ich nich ^^

[c]VARIANT vtProp; [/c]
Hier wird eine Variable vom Typ VARIANT definiert

[c]VariantInit(&vtProp); [/c]
Hier wird sie per Pointer an eine Procedure übergeben.
kA was VariantInit macht, vielleicht setzt sie irgendwelche werte.

[c]
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
[/c]
:shock: kA weiß jemand was dieses pclsObj ist und was Get
macht?

[c]
wcout << " OS Name : " << vtProp.bstrVal << endl;
[/c]
Hier wird der wert eines Strukturfeldes von vtProp ausgegeben

[c]
VariantClear(&vtProp);
[/c]
Und hier wird die Variable entweder gelöscht oder einfach nur
geleert.


Also, definitiv keine Struktur :mrgreen:
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

So wie ich das Verstanden hab, bräuchten wir doch sowas:
Ich check VB aber absolut nicht, das soll hier auch nur ein Beispiel sein, wie ich mir VARIANT erklär:

Code: Alles auswählen

Structure VARIANT
  StructureUnion
    Long.l      ; Jedes Feld (Long, Float und String) befinden sich
    Float.f      ; an derselben Stelle im Speicher.
    String.s    ;
  EndStructureUnion
EndStructure
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);

kA weiß jemand was dieses pclsObj ist und was Get
macht?
jo!
Aus der Struktur pclsObj.IWbemClassObject hole dir (get) die Zeile mit "Name" und übergebe das Ergebnis an vtProp.
übersetzt in PB:

Code: Alles auswählen

hres=pclsObj\get(ansi2bstr("Name"), 0, @vtProp, 0, 0)  
hab im franz. Forum das hier gefunden:
http://purebasic.hmt-forum.com/viewtopi ... 7b0992c0d6
interessant ist der Teil ab 'mem=AllocateMemory(1000)'.
Leider verstehe ich kein Wort französisch :cry:
... und babelfish macht das Unverständliche lediglich schwerverständlich.
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Wenn das nicht mein Glückstag ist ... es scheint vollbracht: PB und WMI vereint.

:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:
Ich lade ein zum Test:

Code: Alles auswählen

;- KONSTANTEN  STRUKTUREN  PROZEDUREN
#COINIT_MULTITHREAD=0
#RPC_C_AUTHN_LEVEL_CONNECT=2
#RPC_C_IMP_LEVEL_IDENTIFY=2
#EOAC_NONE=0
#RPC_C_AUTHN_WINNT=10
#RPC_C_AUTHZ_NONE=0
#RPC_C_AUTHN_LEVEL_CALL=3
#RPC_C_IMP_LEVEL_IMPERSONATE=3
#CLSCTX_INPROC_SERVER=1
#WBEM_S_NO_ERROR = 0
#wbemFlagReturnImmediately=16
#wbemFlagForwardOnly=32
#IFlags = #wbemFlagReturnImmediately + #wbemFlagForwardOnly
#WBEM_INFINITE=$FFFFFFFF

Structure d
  l.l
  h.l
EndStructure

Procedure.l ansi2bstr(ansi.s)
  size.l=MultiByteToWideChar_(#CP_ACP,0,ansi,-1,0,0)
  Dim unicode.w(size)
  MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size)
  ProcedureReturn SysAllocString_(@unicode())
EndProcedure

Procedure.s unicode2ansi(mem)
  ansi.s=""
  Repeat
    a=PeekW(mem)
    ansi=ansi+Chr(a)
    mem+2
  Until a=0
  ProcedureReturn ansi
EndProcedure

Procedure bstr2string (bstr)
  Shared result.s
  result.s = ""
  pos=bstr
  While PeekW (pos)
    result=result+Chr(PeekW(pos))
    pos=pos+2
  Wend
  ProcedureReturn @result
EndProcedure

;- WMI

; --- Step 1: Initialize COM parameters with a call to CoInitializeEx
CoInitializeEx_(0,#COINIT_MULTITHREAD)
  
  ; --- Step 2: Initialize COM process security by calling CoInitializeSecurity.

hres=CoInitializeSecurity_(0, -1,0,0,#RPC_C_AUTHN_LEVEL_CONNECT,#RPC_C_IMP_LEVEL_IDENTIFY,0,#EOAC_NONE,0)
If hres <> 0: MessageRequester("ERROR", "unable to call CoInitializeSecurity", #MB_OK): Goto cleanup: EndIf

  ; --- Step 3: Obtain the initial locator to WMI by calling CoCreateInstance.

hres=CoCreateInstance_(?CLSID_WbemLocator,0,#CLSCTX_INPROC_SERVER,?IID_IWbemLocator,@loc.IWbemLocator)
If hres <> 0: MessageRequester("ERROR", "unable to call CoCreateInstance", #MB_OK): Goto cleanup: EndIf  

  ; --- Step 4: Obtain a pointer to IWbemServices for the root\cimv2 namespace on the local computer by calling IWbemLocator::ConnectServer.

hres=loc\ConnectServer(ansi2bstr("root\cimv2"),0,0,0,0,0,0,@svc.IWbemServices)
If hres <> 0: MessageRequester("ERROR", "unable to call IWbemLocator::ConnectServer", #MB_OK): Goto cleanup: EndIf  
hres=svc\queryinterface(?IID_IUnknown,@pUnk.IUnknown)
  
  ; --- Step 5: Set IWbemServices proxy security so the WMI service can impersonate the client by calling CoSetProxyBlanket.

hres=CoSetProxyBlanket_(svc,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE)
If hres <> 0: MessageRequester("ERROR", "unable to call CoSetProxyBlanket", #MB_OK): Goto cleanup: EndIf  
hres=CoSetProxyBlanket_(pUnk,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE)
If hres <> 0: MessageRequester("ERROR", "unable to call CoSetProxyBlanket", #MB_OK): Goto cleanup: EndIf  
pUnk\release()
  
  ; --- Step 6: Use the IWbemServices pointer to make requests of WMI. This example executes a query for the name of the operating system by calling
  ; ---             IWbemServices::ExecQuery And passing in the following WQL query as one of the method arguments:
  ; ---                                                    Select * FROM Win32_OperatingSystem 
  ; ---             The result of this query is stored in an IEnumWbemClassObject pointer. This allows the data objects from 
  ; ---             the query to be retrieved semisynchronously with the IEnumWbemClassObject Interface.

hres=svc\ExecQuery(ansi2bstr("WQL"),ansi2bstr("SELECT * FROM Win32_OperatingSystem"), #IFlags,0,@pEnumerator.IEnumWbemClassObject)
If hres <> 0: MessageRequester("ERROR", "unable to call IWbemServices::ExecQuery", #MB_OK): Goto cleanup: EndIf  

  ; --- Step 7: Get and display the data from the WQL query. The IEnumWbemClassObject pointer is linked to the data objects that the query returned, 
  ; ---            and the data objects can be retrieved with the IEnumWbemClassObject::Next method. This method links the data objects to an IWbemClassObject pointer 
  ; ---            that is passed into the method. Use the IWbemClassObject::Get method to get the desired information from the data objects. 
  ; ---            In this example, the name of the operating system is the desired information.

mem=AllocateMemory(1000)
hres=pEnumerator\reset()

Repeat

  hres=pEnumerator\Next(#WBEM_INFINITE, 1, @pclsObj.IWbemClassObject, @uReturn)
hres=pclsObj\get(ansi2bstr("Name"), 0, mem, 0, 0)

type=PeekW(mem)

Select type
  Case 8
    val.s=PeekS(bstr2string(PeekL(mem+8)))
  Case 3
    val.s=Str(PeekL(mem+8))
  Default
    val.s=""
EndSelect

If uReturn <> 0: MessageRequester("WMI-Message:", val, #MB_OK): EndIf

Until uReturn = 0

; --- Step 8: Cleanup
cleanup:
svc\release()
loc\release()
pEnumerator\release()
pclsObj\release()
CoUninitialize_()

End

;- DATA
DataSection
CLSID_IEnumWbemClassObject:
   ;1B1CAD8C-2DAB-11D2-B604-00104B703EFD
Data.l $1B1CAD8C
Data.w $2DAB, $11D2
Data.b $B6, $04, $00, $10, $4B, $70, $3E, $FD
IID_IEnumWbemClassObject:
   ;7C857801-7381-11CF-884D-00AA004B2E24
Data.l $7C857801
Data.w $7381, $11CF
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24
CLSID_WbemLocator:
    ;4590f811-1d3a-11d0-891f-00aa004b2e24
Data.l $4590F811
Data.w $1D3A, $11D0
Data.b $89, $1F, $00, $AA, $00, $4B, $2E, $24
IID_IWbemLocator:
    ;dc12a687-737f-11cf-884d-00aa004b2e24
Data.l $DC12A687
Data.w $737F, $11CF
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24
IID_IUnknown:
    ;00000000-0000-0000-C000-000000000046
Data.l $00000000
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
IID_IWbemRefresher:
    ;49353c99-516b-11d1-aea6-00c04fb68820
Data.l $49353C99
Data.w $516B, $11D1
Data.b $AE, $A6, $00, $C0, $4F, $B6, $88, $20
CLSID_WbemRefresher:
    ;c71566f2-561E-11D1-AD87-00C04FD8FDFF
Data.l $C71566F2
Data.w $561E, $11D1
Data.b $AD,$87,$00,$C0,$4F,$D8,$FD,$FF
IID_IWbemConfigureRefresher:
    ;49353c92-516b-11d1-aea6-00c04fb68820
Data.l $49353C92
Data.w $516B, $11D1
Data.b $AE, $A6, $00, $C0, $4F, $B6, $88, $20
IID_IWbemObjectAccess:
    ;49353c9a-516b-11d1-aea6-00c04fb68820
Data.l $49353C9A
Data.w $516B, $11D1
Data.b $AE, $A6, $00, $C0, $4F, $B6, $88, $20

EndDataSection 
:lol:
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

:?
Kein Interesse?
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

Habe den Code jetzt mal in "Code, Tipps und Tricks" veröffentlicht.
Viel Spass damit.
:mrgreen:
Antworten