1 (изменено: Dworkin, 2014-04-22 21:36:33)

Тема: AHK: Функция чтения памяти не выдавала ошибку

Привет. Для чтения памяти я использую эту функцию.

ProcessReadMemory(address, processIDorName, type := "Int", numBytes := 4) {
    VarSetCapacity(buf, numBytes, 0)
    VarSetCapacity(numBytesRead, A_PtrSize, 0)

    Process Exist, %processIDorName%
    if !processID := ErrorLevel
        throw Exception("Invalid process name or process ID:`n`n""" . processIDorName . """")

    if !processHandle := DllCall("OpenProcess", "Int", 24, "UInt", 0, "UInt", processID, "Ptr")
        throw Exception("Failed to open process.`n`nError code:`t" . A_LastError)

    result := DllCall("ReadProcessMemory", "Ptr", processHandle, "Ptr", address, "Ptr", &buf, "Ptr", numBytes, "PtrP", numBytesRead, "UInt")

    if !DllCall("CloseHandle", "Ptr", processHandle, "UInt") && !result
        throw Exception("Failed to close process handle.`n`nError code:`t" . A_LastError)

    if !result
        throw Exception("Failed to read process memory.`n`nError code:`t" . A_LastError)

    if !numBytesRead
        throw Exception("Read 0 bytes from the`n`nprocess:`t" . processIDorName . "`naddress:`t" . address)

    return NumGet(buf, 0, type)
}

Когда нельзя прочитать что-то из памяти то выдается ошибка и эта ошибка мешает выполнять скрипт дальше. Если смотреть на адрес через программу СЕ, то когда там нет значений там вопросительные знаки. Дело в том что при определеных условиях в одном из адрессов значение может быть 100, а может и вопросительные знаки, тоесть скрипт не может прочитать и поетому начинает выдавать ошибку. Как сделать так что бы функция, когда не может прочитать значение по адресу не выдавала ошибку и соответственно не тормозила бы скрипт?

2

Re: AHK: Функция чтения памяти не выдавала ошибку

try ProcessReadMemory(...)

Если ошибку нужно обрабатывать:

try ProcessReadMemory(...)
catch e {
...
}

3

Re: AHK: Функция чтения памяти не выдавала ошибку

bWRmeA пишет:
try ProcessReadMemory(...)

Если ошибку нужно обрабатывать:

try ProcessReadMemory(...)
catch e {
...
}

Можно на примере показать, а то не могу понять?(

4

Re: AHK: Функция чтения памяти не выдавала ошибку

Если в runtime возникают ошибки их можно подавить выполняя код в блоке команды try.

try ProcessReadMemory(...) 

это  есть пример, вместо многоточия - параметры.

try value := ProcessReadMemory(...) 
try {
    value := ProcessReadMemory(...)
}