Seite 3 von 4

Verfasst: 30.03.2005 00:30
von TheM4st0r
das problem is, das besagte funktion eben keinen zeiger auf nen string sondern auf ne structur des Typs Variant erwartet.

Verfasst: 30.03.2005 00:46
von 125
Seit wann ist das jetzt ne Strucuture? eben wars noch ne Variable.

Verfasst: 30.03.2005 01:08
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...

Verfasst: 30.03.2005 07:08
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 ?

Verfasst: 30.03.2005 09:24
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:

Verfasst: 30.03.2005 12:13
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

Verfasst: 30.03.2005 12:37
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.

Verfasst: 10.04.2005 13:24
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:

Verfasst: 10.04.2005 20:43
von DataMiner
:?
Kein Interesse?

Verfasst: 11.04.2005 09:41
von DataMiner
Habe den Code jetzt mal in "Code, Tipps und Tricks" veröffentlicht.
Viel Spass damit.
:mrgreen: