ich habe einen Code ausgegraben:
Code: Alles auswählen
;- CPU-Auslastung-Ermittlung mit der PDH.DLL
;- "Helle" Klaus Helbing, 09.10.2012, tested with PB4.61 (x64), Win7/64 and PB4.61 (x86), Win-XP
;- Use Debug
If OpenLibrary(0, "PDH.DLL") ;MS-File in \System32
SI.SYSTEM_INFO
#PDH_CSTATUS_NEW_DATA = $1
#PROCESSOR_ARCHITECTURE_AMD64 = $9
GetSystemInfo_(@SI) ;Anzahl der Cores ermitteln
AnzCore.l = SI\dwNumberOfProcessors
Is64.i = SI\wProcessorArchitecture ;w -> i
Buffer.i = AllocateMemory(8 * AnzCore)
CoreLast.d
CoreLast64.d
hQuery.l
Prototype.l ProtoOpenQuery(Para1.l)
Prototype.l ProtoCloseQuery(Para1.l)
Prototype.l ProtoCollectData(Para1.l)
Prototype.d ProtoAuslastung(Para1.l, Para2.l)
Prototype.l ProtoAddCounter(Para1.l, Para2.i, Para3.i)
Lang = GetSystemDefaultLangID_() & $FFFF
Select Lang
Case $407 ;GE
P1$ = "Prozessor"
P2$ = "Prozessorzeit"
Case $409 ;EN_US ckeck it :-)!
P1$ = "Processor"
P2$ = "Processor Time"
Case $40C ;FR check it :-)!
P1$ = "Processeur"
P2$ = "temps Processeur"
;..... Other Languages
EndSelect
OpenQuery.ProtoOpenQuery = GetFunction(0, "PdhVbOpenQuery")
CloseQuery.ProtoCloseQuery = GetFunction(0, "PdhCloseQuery") ;PdhVbCloseQuery z.B. nicht für Server 2003 !
CollectData.ProtoCollectData = GetFunction(0, "PdhCollectQueryData")
AddCounter.ProtoAddCounter = GetFunction(0, "PdhVbAddCounter")
Auslastung.ProtoAuslastung = GetFunction(0, "PdhVbGetDoubleCounterValue")
RetVal = OpenQuery(@hQuery)
If RetVal
MessageRequester("Fehler !", "Aufruf von PdhVbOpenQuery fehlgeschlagen!") ;Error-Message OpenQuery
End
EndIf
For i = 0 To AnzCore - 1
Proz$ = "\" + P1$ + "(" + Str(i) + ")\" + P2$ + " (%)"
RetVal = AddCounter(hQuery, @Proz$, Buffer + (i << 2))
If RetVal
MessageRequester("Fehler !", "Aufruf von PdhVbAddCounter für Core"+ Str(i) + " fehlgeschlagen!") ;Error-Message AddCounter
;End
EndIf
Next
Repeat
CollectData(hQuery)
Auslastung$ = ""
For i = 0 To AnzCore - 1
CoreLast = Auslastung(PeekL(Buffer + (4 * i)), PeekL(Buffer + (4 * AnzCore) + (i << 2)))
!movsd [v_CoreLast64],xmm0 ;64-Bit-DLL: Float-/Double-Return-Value in XMM0!
If Is64 = #PROCESSOR_ARCHITECTURE_AMD64
CoreLast = CoreLast64
EndIf
Auslastung$ + "Core" + Str(i) + " = " + StrD(CoreLast, 2) + "%" + Space(20)
If PeekL(Buffer + (4 * AnzCore) + (i << 2)) > #PDH_CSTATUS_NEW_DATA ;s.o.
A = -1 ;war kein gültiger Wert
Break
EndIf
Next
If A <> -1
Debug Auslastung$
EndIf
Delay(1000)
ForEver
CloseQuery(hQuery)
CloseLibrary(0)
EndIf
Ich denke das liegt daran, das dies ein sehr altes und für 32 Bit ausgelegtes beispiel ist.
Weis jemand wie ich das ändern muss?
Gruss TFT