Пространства имен

Smer4

Известный
Автор темы
424
51
Вообщем, например в c++ есть функция using namespace для того что-бы переменные если что не совпадали если они есть одноименные, а как так на AHK сделать, у меня например заготовка под мультипоток есть
AutoHotKey:
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
file = %A_ScriptDir%/Surce/AutoHotkey.dll
#Include %A_ScriptDir%/Surce/sizeof.ahk
#Include %A_ScriptDir%/Surce/Struct.ahk
#Include %A_ScriptDir%/Surce/MemoryLibrary.ahk
#Include %A_ScriptDir%/Surce/AhkDllThread.ahk
FileInstall, file, AutoHotkey.dll
Там есть переменная file и если я в основном скрипте напишу это
AutoHotKey:
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#Include includes.ahk
MsgBox, % file
то выскочит путь к autohotkey.dll, как мне сделать другое пространство имен для переменной file?
 
Последнее редактирование:

index

Известный
126
82
Классами можно сделать.
Неймспейсов и глобальных переменных в рамках одного файла как в c/c++ нет. Здесь инклуд делается фактически копированием содержимого одного файла в другой.

Если что - в AHK_L тоже можно такой псевдомногопоточности (многопроцессности, точнее) добиться, передав интерпретатору код через стандартный поток ввода.
Autohotkey.exe должен быть в PATH или рядом со скриптом (с помощью того же Fileinstall, к примеру).
AutoHotKey:
code =
(
#notrayicon
msgbox Привет из нового процесса
)
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec("AutoHotkey.exe *")
exec.StdIn.Write(code)
exec.StdIn.Close()
 
  • Нравится
Реакции: Smer4

Smer4

Известный
Автор темы
424
51
Классами можно сделать.
Неймспейсов и глобальных переменных в рамках одного файла как в c/c++ нет. Здесь инклуд делается фактически копированием содержимого одного файла в другой.

Если что - в AHK_L тоже можно такой псевдомногопоточности (многопроцессности, точнее) добиться, передав интерпретатору код через стандартный поток ввода.
Autohotkey.exe должен быть в PATH или рядом со скриптом (с помощью того же Fileinstall, к примеру).
AutoHotKey:
code =
(
#notrayicon
msgbox Привет из нового процесса
)
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec("AutoHotkey.exe *")
exec.StdIn.Write(code)
exec.StdIn.Close()
Максимум что я смог сделать это написать это, дальше не понимаю что делать
AutoHotKey:
class Install
{
   
}

Немного что-то получилось
AutoHotKey:
class Install
{
}
class r
{
    c(){
        c := GetKeyState("Numpad1","P")
        return C
    }
}
Install.Get := r.c()
MsgBox, % Install.Get

А так ошибка выводится.
AutoHotKey:
class Install
{
install(){
file = %A_ScriptDir%/Surce/AutoHotkey.dll
#Include %A_ScriptDir%/Surce/sizeof.ahk
#Include %A_ScriptDir%/Surce/Struct.ahk
#Include %A_ScriptDir%/Surce/MemoryLibrary.ahk
#Include %A_ScriptDir%/Surce/AhkDllThread.ahk
FileInstall, file, AutoHotkey.dll
}
}
Install.install()
MsgBox,% file

Захотел для мультипотока написать класс, но сразу в ступор, незнаю как имя потоку задать выдает ошибку
code =
AutoHotKey:
class MultiThread
{
    Create(name)
    {
    shell := ComObjCreate("WScript.Shell")
    exec := shell.%name%("AutoHotkey.exe *")
    }
}

так тоже ошибка, "неизвестное имя"
AutoHotKey:
class MultiThread
{
    Create(name)
    {
    shell := ComObjCreate("WScript.Shell")
    exec := shell.name("AutoHotkey.exe *")
    }
}
MT := new MultiThread
MT.Create(new)
Sleep, 10000
 

index

Известный
126
82
А так ошибка выводится.
Ты просил аналог пространства пространства имён
AutoHotKey:
#Include ...
class foo
{
    static bar := "somedll.dll"
}
FileInstall, % foo.bar, myfilename.dll
Захотел для мультипотока написать класс, но сразу в ступор, незнаю как имя потоку задать выдает ошибку
code =
так тоже ошибка, "неизвестное имя"
Ты запускаешь отдельный процесс интерпретатора ахк (Autohotkey.exe), а не поток. При этом передаешь ему код через StdIn.
AutoHotKey:
code =
(
#notrayicon
msgbox Привет из нового процесса
)
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec("С:\ahk\AutoHotkey.exe *") ; путь к интерпретатору. Если он в PATH или рядом со скритом - можно и без полного пути обойтись. * - "файл" stdin
exec.StdIn.Write(code) ; передаём код через stdin
exec.StdIn.Close()
 
  • Нравится
Реакции: Smer4

Smer4

Известный
Автор темы
424
51
Ты запускаешь отдельный процесс интерпретатора ахк (Autohotkey.exe), а не поток. При этом передаешь ему код через StdIn.
AutoHotKey:
code =
(
#notrayicon
msgbox Привет из нового процесса
)
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec("С:\ahk\AutoHotkey.exe *") ; путь к интерпретатору. Если он в PATH или рядом со скритом - можно и без полного пути обойтись. * - "файл" stdin
exec.StdIn.Write(code) ; передаём код через stdin
exec.StdIn.Close()
но можно-же функцию написать что бы не писать о открытии Shell-а, внедрении туда auto.. .exe, а просто прописать Create(name,code), конечно понимаю что это уже не в этой теме должно быть но все-же.
 

index

Известный
126
82
AutoHotKey:
#NoEnv
#Persistent

class ahk_interpreter
{
    __New(code)
    {
        this.shell := ComObjCreate("WScript.Shell")
        this.exec := this.shell.Exec("AutoHotkey.exe *")
        this.exec.StdIn.Write(code)
        this.exec.StdIn.Close()
    }
   
    terminate()
    {
        this.exec.terminate()
    }
}

code =
(
#notrayicon
msgbox Процесс 1
)
code1 =
(
#notrayicon
msgbox Процесс 2
)

myCode1 := new ahk_interpreter(code)
myCode2 := new ahk_interpreter(code1)
Sleep 3000
myCode2.Terminate()
Sleep 2000
myCode1.Terminate()
 
  • Нравится
Реакции: Smer4