1

Тема: AHK: Как получить имя переменной

Приветствую всех, давно не посещал данный форум.

И так - сабж.

dd = "test"
vv := &dd
  msgbox ,   %vv% " " %dd%
exit

Адрес получил, а что с ним делать?
Есть метод получения имени переменной?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

2 (изменено: YMP, 2013-10-14 18:45:19)

Re: AHK: Как получить имя переменной

Indomito пишет:

Адрес получил, а что с ним делать?

То, для чего вы его получали.

Есть метод получения имени переменной?

Зачем?

3

Re: AHK: Как получить имя переменной

Indomito пишет:

Есть метод получения имени переменной?

YMP пишет:

Зачем?

нужно, для диагностики. Просто есть функция проверки... ну скажем проще - очень нужно

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4

Re: AHK: Как получить имя переменной

Предварительно внести все имена используемых переменных в список, по-другому никак, разве что прочитать из главного окна скрипта.

list := ["var1", "var2"]
var1 := 1, var2 := 2

addr1 := &var1

for k,v in list
   if (&%v% = addr1)
      MsgBox, % v
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Как получить имя переменной

teadrinker пишет:

Предварительно внести все имена используемых переменных в список, по-другому никак...

спасибо, этот метод мне подойдёт... странно, что я сам не сообразил

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

6 (изменено: serzh82saratov, 2015-09-14 16:43:07)

Re: AHK: Как получить имя переменной

Возможно ли в таком варианте получить имена переменных?
Конечно оставив возможность получения значений.


c()

c() {
    value1 := 111, value2 := 222 
    f(value1, value2) ; допускается передавать адреса
}

f(p*) {
    for k, v in p
    {
        MsgBox Надо получить строки "value1" и "value2"
    }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: yalanne, 2015-09-14 17:48:20)

Re: AHK: Как получить имя переменной

Вот так подходит?

h:=new h
c()

c() {
    h.value1 := 111, h.value2 := 222 
    f(h.value1, h.value2)
}

f(p*) {
    for k, v in p
    {
        MsgBox % "Переменная:`t" h.list_var_name[k]
            . "`nЗначение:`t" v
    }
    
    h.Clear()
}

Class h
{
static list_var_name:=[]
    __Set(namevar)
    {
        this.list_var_name.Insert(namevar)
    }
    Clear()
    {
        this.list_var_name := []
    }
}

8

Re: AHK: Как получить имя переменной

Не, так не подходит.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Как получить имя переменной

Серж, а какую цель должна достигать такая хитрая задача? Возможно, с помощью другого алгоритма можно решить более традиционнымми методами.

10

Re: AHK: Как получить имя переменной

Цель добится простого синтаксиса при передаче параметров, иначе методы очевидны.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Как получить имя переменной

А есть языки с таким синтаксисом, чтобы помимо передачи переменной по ссылке или значению, в функцию передавалось название переменной? Ведь само по себе это название ничем ценным не яляется, т.к. после компиляции будет просто индексом в таблице переменных.

12

Re: AHK: Как получить имя переменной

А конкретный пример, когда это может быть полезно, есть?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13 (изменено: serzh82saratov, 2015-09-14 19:35:37)

Re: AHK: Как получить имя переменной

Ну если честно, я понимаю маловероятность решения.
Если передать адрес локальной переменной, то можно узнать её значение, вдруг в AutoHotkey каким то образом, где то в памяти сохраняется и имя этой переменной.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Как получить имя переменной

А конкретный пример, когда это может быть полезно, есть?

Здесь при вызове Hotkey_Register.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Как получить имя переменной

Скажем так, не то чтобы полезно, но удобно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Как получить имя переменной

А почему там просто значения не передавать?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Как получить имя переменной

Впоследствии нужна привязка к именам, для сохранения или извлечения.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18 (изменено: Irbis, 2015-09-14 20:18:21)

Re: AHK: Как получить имя переменной

А не проще хранение организовать в массиве? В таком случае MyHotkey1, MyHotkey2 будут просто ключами, и не нужно будет искать хитрые методы для извлечения значений локальных переменных другой функции. По-моему это и было предложено в посте #7.

19 (изменено: serzh82saratov, 2015-09-14 21:07:23)

Re: AHK: Как получить имя переменной

Глобальный массив\объект исключён. В посте #7 не удобно, твоё предложение не до конца понял, можешь на примере.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: Как получить имя переменной

Irbis пишет:

А есть языки с таким синтаксисом, чтобы помимо передачи переменной по ссылке или значению, в функцию передавалось название переменной?

Коллекции в WSH. На примере VBS:

NameVar1 = "123"
NameVar2 = "456"
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add NameVar1, "NameVar1"
Dict.Add NameVar2, "NameVar2"
MsgBox Dict("123")

Также можно с пом. ADO.

21

Re: AHK: Как получить имя переменной

Так:

var=123
Varname=var
Msgbox,% %varname%

?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

22

Re: AHK: Как получить имя переменной

Нет, конечно. Где связь? Тут возвращается значение дубликата одной из переменных, а в моём примере - имя переменной по его значению.

23

Re: AHK: Как получить имя переменной

Flasher, а чем это отличается от

NameVar1 := 123
NameVar2 := 456
Dict := {}
Dict[NameVar1] := "NameVar1"
Dict[NameVar2] := "NameVar2"
MsgBox, % Dict[123]

?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: AHK: Как получить имя переменной

Вот, похоже. А аналог Dict.Exists тут имеется?

25

Re: AHK: Как получить имя переменной

Имеется.

NameVar1 := "key"
Dict := {}
Dict[NameVar1] := "NameVar1"
MsgBox, % Dict.HasKey(NameVar1) "`n" Dict.HasKey("key") "`n" Dict[NameVar1] "`n" Dict.key
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Как получить имя переменной

Вот имя переменной по адресу.

MyTestVar := 123
MsgBox, % "|" GetVarName(&MyTestVar) "|"

GetVarName(pPtr)
{
   static MEM_COMMIT := 0x1000, PAGE_GUARD := 0x100, PAGE_NOACCESS := 0x1
        , PROCESS_VM_READ := 0x10, PROCESS_QUERY_INFORMATION := 0x400, PROCESS_VM_OPERATION := 0x8
   
   SetBatchLines, -1
   hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_QUERY_INFORMATION
                                    , Int, 0, UInt, DllCall("GetCurrentProcessId"), Ptr)

   VarSetCapacity(MBI, size := A_PtrSize*5 + 4*2, 0)
   addr := 0
   while DllCall("VirtualQuery", Ptr, addr, Ptr, &MBI, Ptr, size)
   {
      BaseAddress := NumGet(MBI)
      RegionSize := NumGet(MBI, A_PtrSize*3)
      State := NumGet(MBI, A_PtrSize*4, "UInt")
      Protect := NumGet(MBI, A_PtrSize*4 + 4, "UInt")
      addr += RegionSize
      
      if (BaseAddress < 0xFFFFF && A_PtrSize = 8) || (BaseAddress < 0x7FFFFF && A_PtrSize = 4)
         continue

      if (State != MEM_COMMIT || (Protect & PAGE_NOACCESS) || (Protect & PAGE_GUARD))
         continue
      
      VarSetCapacity(buff, RegionSize, 0)
      if !DllCall("ReadProcessMemory", Ptr, hProcess, Ptr, BaseAddress, Ptr, &buff, Ptr, RegionSize, PtrP, BytesRead)  {
         MsgBox, Ошибка чтения памяти %A_LastError%
         break
      }
      Loop % BytesRead - A_PtrSize
      {
         p := &buff + (A_Index - 1)
         if NumGet(p+0) != pPtr
            continue
         
         err := i := 0
         Loop
            num := NumGet(p - 16 - A_Index*4, "Int"), i += 4
         until num = 0 || (A_Index = 20 && err := 1)
         if err
            continue
         
         if RegExMatch(str := StrGet(p - 16 - i + 4 + (A_PtrSize = 4 ? 4 : 0)), "^[\w#_@\$]+$")
            break 2
      }
      VarSetCapacity(buff, 0)
   }
   DllCall("CloseHandle", Ptr, hProcess)
   Return str
}

Но это шутка, конечно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: Как получить имя переменной

Почему? Работает (только под x64) и с локальными, правда на переменную полсекунды уходит, но сама возможность уже большой прорыв.

f()

f() {  
    MsgBox, % "|" GetVarName(&MyTestVar) "|"
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Как получить имя переменной

Но это шутка, конечно.

Теперь понял, ищется же просто по значению.

Var := 123 
MsgBox, % "|" GetVarName(&MyTestVar) "|"
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29

Re: AHK: Как получить имя переменной

Нет, шутка не в этом. А что тебя смущает в последнем примере? Передаём указатель, получаем имя. Просто скрипт считает переменную, записанную таким образом, уже существующей.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

30 (изменено: serzh82saratov, 2015-09-16 15:16:15)

Re: AHK: Как получить имя переменной

В последнем примере #28 получаем не то имя.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31

Re: AHK: Как получить имя переменной

А, ну это просто проблемы с х32, там переменные в памяти записываются по пока непонятному мне принципу, на х64 работает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

32 (изменено: Alectric, 2015-09-16 15:36:33)

Re: AHK: Как получить имя переменной

Вообще это не логично, т.к. если будут две разные переменные с одинаковым содержимым, то любой код найдет только первую попавшуюся, а если и найдет обе, то какая будет "нужной", все равно не определит.
Или я не прав?

...
В любом случае нужно будет создавать список переменных.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

33

Re: AHK: Как получить имя переменной

Не понял последнее. Переменная ищется в памяти по адресу, а не по содержимому.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34

Re: AHK: Как получить имя переменной

А, ну это просто проблемы с х32

На х32 вообще не работает. На х64 возвращает "Var", а требуется "MyTestVar".

Var := 123 
MsgBox, % "|" GetVarName(&MyTestVar) "|"
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35

Re: AHK: Как получить имя переменной

А тут что ищет?

Var2 := 123 
Var1 := 123  

MsgBox, % "|" GetVarName(&Var3) "|"
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

36

Re: AHK: Как получить имя переменной

С таким видом записи ещё не разбирался, получается "Var2". Просто так не нужно записывать, лучше так:

Var2 := 123 
Var1 := 123  

MsgBox, % "|" GetVarName(&Var1) "|"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

37

Re: AHK: Как получить имя переменной

А с чем связана длительность ожидания? Насколько помню прочитать указанный адрес не долго, что то ищется по всему адресному пространству?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

38 (изменено: teadrinker, 2015-09-16 16:18:39)

Re: AHK: Как получить имя переменной

По адресу переменной её имени нет, там только значение. В определённом месте скрипта записано имя переменной и через какое-то смещение её адрес в виде последовательности байтов, соответствующей его числовому значению. Это число и ищем в адресном пространстве. Ради оптимизации отсечено

      if (BaseAddress < 0xFFFFF && A_PtrSize = 8) || (BaseAddress < 0x7FFFFF && A_PtrSize = 4)
         continue

но более точно указать область поиска я не знаю как.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

39

Re: AHK: Как получить имя переменной

teadrinker пишет:

Не понял последнее. Переменная ищется в памяти по адресу, а не по содержимому.

Вопрос вроде был - найти имя переменной по содержимому, нет?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

40

Re: AHK: Как получить имя переменной

А как тогда отличать переменные с одинаковым содержимым?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

41

Re: AHK: Как получить имя переменной

Вопрос вроде был - найти имя переменной по содержимому, нет?

Нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

42

Re: AHK: Как получить имя переменной

В любом случае, алгоритм пока сырой, надо разобраться получше.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

43

Re: AHK: Как получить имя переменной

Наверняка есть какая то логика.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

44

Re: AHK: Как получить имя переменной

Во всяком случае, я заметил, что она разная для х32 и х64.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

45

Re: AHK: Как получить имя переменной

Раз уже такую тему подняли, для чего нужен оператор разадрессации "*"? Как это используется на практике?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

46

Re: AHK: Как получить имя переменной

Var1 := 123
Var2 := "abc"
Dereference1 := *&Var1
Dereference2 := *&Var2

msgbox % &Var1 " | " Dereference1 "`n" &Var2 " | " Dereference2
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

47 (изменено: Alectric, 2015-09-16 17:04:25)

Re: AHK: Как получить имя переменной

Dereference1 := *&Var1

Может так:

Dereference1 := *Var1

?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

48

Re: AHK: Как получить имя переменной

VarSetCapacity(var, 2)
NumPut(0x1234, var)
SetFormat, IntegerFast, H
MsgBox, % NumGet(var, "UShort") "`n" *&var
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

49 (изменено: serzh82saratov, 2015-09-16 17:09:06)

Re: AHK: Как получить имя переменной

Может так:

Операндом Dereference может служить только адрес.

teadrinker а о чём говорит последний пример?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

50 (изменено: Alectric, 2015-09-16 17:16:51)

Re: AHK: Как получить имя переменной

setformat,integer,h
var=0x1
Var1 := &var
msgbox % "адрес`t`t" &Var1 "`nкакой-то там первый байт (судя по справке)`t`t" *Var1 "`nсодержимое`t`t" Var1  "`n`nадрес`t`t" &Var "`nкакой-то там первый байт (судя по справке)`t`t" *var "`nсодержимое`t`t" Var
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

51

Re: AHK: Как получить имя переменной

Если пока не понятно, то вот ещё:

VarSetCapacity(var, 2)
NumPut(0x1234, var)
SetFormat, IntegerFast, H
MsgBox, % NumGet(var, "UShort") "`n" *&var "`n" NumGet(var, "UChar")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

52 (изменено: serzh82saratov, 2015-09-16 17:23:54)

Re: AHK: Как получить имя переменной

Короче это просто первый байт памяти по указанному адресу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui