Page 2 of 2

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 18 Oct 2013, 14:57
by just me
Klassen machen manchmal durchaus Sinn, aber nicht immer!

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 18 Oct 2013, 15:03
by jNizM
Und woran liegt es genau?

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)
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

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 18 Oct 2013, 19:05
by HotKeyIt
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

Posted: 19 Oct 2013, 01:04
by jNizM
Ok. Das gilt aber nur innerhalb einer Funktion?
Oder muss ich dass über das ganze Script so ziehen?

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 19 Oct 2013, 02:36
by just me
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.

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 22 Oct 2013, 01:56
by jNizM
Hab das jetzt so gelöst:
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
}

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 22 Oct 2013, 04:46
by nnnik
Nur so als Frage rufst du die Funktion sehr oft auf?

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 22 Oct 2013, 05:06
by jNizM
relativ oft ;)
Immer her mit Verbesserung =)

edit: http://ahkscript.org/boards/viewtopic.php?f=6&t=254

Re: Besserer Aufbau einer Funktion mit DllCalls

Posted: 22 Oct 2013, 06:29
by nnnik
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.