Besserer Aufbau einer Funktion mit DllCalls

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

just me
Posts: 9505
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Besserer Aufbau einer Funktion mit DllCalls

18 Oct 2013, 14:57

Klassen machen manchmal durchaus Sinn, aber nicht immer!
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Besserer Aufbau einer Funktion mit DllCalls

18 Oct 2013, 15:03

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
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
HotKeyIt
Posts: 2364
Joined: 29 Sep 2013, 18:35
Contact:

Re: Besserer Aufbau einer Funktion mit DllCalls

18 Oct 2013, 19:05

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)
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Besserer Aufbau einer Funktion mit DllCalls

19 Oct 2013, 01:04

Ok. Das gilt aber nur innerhalb einer Funktion?
Oder muss ich dass über das ganze Script so ziehen?
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
just me
Posts: 9505
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Besserer Aufbau einer Funktion mit DllCalls

19 Oct 2013, 02:36

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.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Besserer Aufbau einer Funktion mit DllCalls

22 Oct 2013, 01:56

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
}
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
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Besserer Aufbau einer Funktion mit DllCalls

22 Oct 2013, 04:46

Nur so als Frage rufst du die Funktion sehr oft auf?
Recommends AHK Studio
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Besserer Aufbau einer Funktion mit DllCalls

22 Oct 2013, 05:06

relativ oft ;)
Immer her mit Verbesserung =)

edit: http://ahkscript.org/boards/viewtopic.php?f=6&t=254
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Besserer Aufbau einer Funktion mit DllCalls

22 Oct 2013, 06:29

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.
Recommends AHK Studio

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 18 guests