Besserer Aufbau einer Funktion mit DllCalls
Moderator: jNizM
Re: Besserer Aufbau einer Funktion mit DllCalls
Klassen machen manchmal durchaus Sinn, aber nicht immer!
Re: Besserer Aufbau einer Funktion mit DllCalls
Und woran liegt es genau?
wenn ich die static PMC auskommeniter gehts obwohl ja da auch 2x static + 2x init dabei ist
Oder darf ich nur nicht in einer Function das doppelt aufrufen mit static init
Code: Select all
GetVersionEx()
static OSVerEX, init := VarSetCapacity(OSVerEX, 284, 0) && Numput(284, OSVerEX, "UInt")
GetProcessMemoryInfo(PID)
static PMCEx, size := (A_PtrSize = "8" ? "80" : "44"), init := VarSetCapacity(PMCEx, size, 0) && NumPut(size, PMCEx)
static PMC, size := (A_PtrSize = "8" ? "72" : "40"), init := VarSetCapacity(PMC, size, 0) && NumPut(size, PMC)
Oder darf ich nur nicht in einer Function das doppelt aufrufen mit static init
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
Re: Besserer Aufbau einer Funktion mit DllCalls
Um Fehler zu vermeiden darf die Variable nur 1 mal deklariert werden.
Code: Select all
GetProcessMemoryInfo(PID){
static PMCEx,PMCExsize := (A_PtrSize = "8" ? "80" : "44"), init := VarSetCapacity(PMCEx, PMCExsize, 0) && NumPut(PMCExsize, PMCEx)
static PMC, PMCsize := (A_PtrSize = "8" ? "72" : "40"), init2 := VarSetCapacity(PMC, PMCsize, 0) && NumPut(PMCsize, PMC)
Re: Besserer Aufbau einer Funktion mit DllCalls
Ok. Das gilt aber nur innerhalb einer Funktion?
Oder muss ich dass über das ganze Script so ziehen?
Oder muss ich dass über das ganze Script so ziehen?
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
Re: Besserer Aufbau einer Funktion mit DllCalls
Statische wie lokale Variablen existieren nur innerhalb der umgebenden Funktion. Du kannst deshalb dieselben Namen in unterschiedlichen Funktionen wiederverwenden und brauchst Dir auch keine Gedanken darüber zu machen, ob der Name im "globalen" Teil des Skripts (d.h. außerhalb von Funktionen) verwendet wird.
Bei mir (Win 7 x64 - AHK U64) liefern übrigens beide API-Funktionen (K32GetProcessMemoryInfo und GetProcessMemoryInfo) identische Ergebnisse. Laut MSDN ist die Struktur PROCESS_MEMORY_COUNTERS_EX seit XP SP2 definiert. Vielleicht machst Du Dir mit der Unterscheidung zu viel Mühe.
Bei mir (Win 7 x64 - AHK U64) liefern übrigens beide API-Funktionen (K32GetProcessMemoryInfo und GetProcessMemoryInfo) identische Ergebnisse. Laut MSDN ist die Struktur PROCESS_MEMORY_COUNTERS_EX seit XP SP2 definiert. Vielleicht machst Du Dir mit der Unterscheidung zu viel Mühe.
Re: Besserer Aufbau einer Funktion mit DllCalls
Hab das jetzt so gelöst:
Für Win 7 x64 / x86 & XP brauch ich beide Funktionen
Für Win 7 x64 / x86 & XP brauch ich beide Funktionen
Code: Select all
BuildVersion := DllCall("GetVersion") >> 16 & 0xffff
if (BuildVersion >= "7600") {
GPMI := GetProcessMemoryInfo_PMCEX(ownPID)
PUsage := Round(GPMI[10] / 1024, 0)
} else {
GPMI := GetProcessMemoryInfo_PMC(ownPID)
PUsage := Round(GPMI[8] / 1024, 0)
}
GetProcessMemoryInfo_PMCEX(PID) {
pu := ""
hProcess := DllCall(Kernel32.OpenProcess, "UInt", 0x001F0FFF, "UInt", 0, "UInt", PID)
if (hProcess) {
static PMCEX, size := (A_PtrSize = "8" ? "80" : "44"), init := VarSetCapacity(PMCEX, size, 0) && NumPut(size, PMCEX)
if (DllCall(Kernel32.K32GetProcessMemoryInfo, "Ptr", hProcess, "UInt", &PMCEX, "UInt", size))
pu := { 10 : NumGet(PMCEX, (A_PtrSize = "8" ? "72" : "40"), "Ptr") }
DllCall(Kernel32.CloseHandle, "Ptr", hProcess)
}
return, % pu
}
GetProcessMemoryInfo_PMC(PID) {
pu := ""
hProcess := DllCall(Kernel32.OpenProcess, "UInt", 0x001F0FFF, "UInt", 0, "UInt", PID)
if (hProcess) {
static PMC, size := (A_PtrSize = "8" ? "72" : "40"), init := VarSetCapacity(PMC, size, 0) && NumPut(size, PMC)
if (DllCall("psapi.dll\GetProcessMemoryInfo", "Ptr", hProcess, "UInt", &PMC, "UInt", size))
pu := { 8 : NumGet(PMC, (A_PtrSize = "8" ? "56" : "32"), "Ptr") }
DllCall(Kernel32.CloseHandle, "Ptr", hProcess)
}
return, % pu
}
Last edited by jNizM on 23 Oct 2013, 02:30, edited 1 time in total.
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
Re: Besserer Aufbau einer Funktion mit DllCalls
Nur so als Frage rufst du die Funktion sehr oft auf?
Recommends AHK Studio
Re: Besserer Aufbau einer Funktion mit DllCalls
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
Re: Besserer Aufbau einer Funktion mit DllCalls
Du könntest anstatt eine PID zu übergeben eine Funktion machen bei der du ein hProcess übergeben musst.
Dies müsstest du dann nur 1 mal Öffnen und 1 mal schließen.
Das würde das OpenProcess und CloseProcess umgehen.
Dies müsstest du dann nur 1 mal Öffnen und 1 mal schließen.
Das würde das OpenProcess und CloseProcess umgehen.
Recommends AHK Studio
Who is online
Users browsing this forum: No registered users and 18 guests