51

Re: AHK: Выполнение переменного кода

Malcev пишет:

Можно передавать название экзешника файлу autohotkey.exe, который будет открывать соответствующий ahk файл.

Зачем, для чего, где, когда?

Malcev пишет:

Это сколько должно быть скриптов

Много, но главный довод не использовать компилированные, я там же привёл.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

52

Re: AHK: Выполнение переменного кода

OFF:: Кажется, этот спор никогда не кончится...

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

53

Re: AHK: Выполнение переменного кода

serzh82saratov пишет:

Зачем, для чего, где, когда?

Не понял вопросов. Уточни.

54 (изменено: serzh82saratov, 2017-12-15 16:38:13)

Re: AHK: Выполнение переменного кода

А понял, ты про то чтоб вместо "ярлыков" использовать компилированные скрипты, ну так это надо их компилировать, если новый на флехе создавать, то сначала надо создать текстовик, потом его на компилятор перенести, текстовик удалить чтобы мусора не было.
Не пойму чем это лучше js, который можно просто просмотреть или поправить в блокноте.
Если уже js запрещён на ПК, так на нём уже постарались наверное и остальную чужеродность не пускать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

55

Re: AHK: Выполнение переменного кода

1) Компилируем один скрипт:

Run, % "autohotkey.exe Lib\" SubStr(A_ScriptName, 1, -4) ".ahk"

2) Дублируем его столько раз, сколько у нас скриптов.
3) Переименовываем эксешники в названия скриптов ахк.
Больше ничего делать не надо, будь то старая флешка или новая.

56

Re: AHK: Выполнение переменного кода

Так пути не изменишь, только имя.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

57

Re: AHK: Выполнение переменного кода

А зачем менять пути?
Создал папку Scripts и всё.

58 (изменено: Alectric, 2017-12-15 17:33:58)

Re: AHK: Выполнение переменного кода

Скомпилировать рядом с AutoHotkeyU32.exe и положить в корень флешки.

#SingleInstance,Force

ahkPath:=a_temp

FileInstall,AutoHotkeyU32.exe,%ahkPath%\AutoHotkeyU32.exe,1

gui,add,ListView,xm ym w600 h400 Grid gScriptsList,Папка|Имя
gui,add,StatusBar
gui,show

paths:=[]
names:=[]
Dirs:=[]
loop,% a_scriptdir "\*.ahk",,1
{
  paths[a_index]:=A_LoopFileFullPath
  names[a_index]:=A_LoopFileName
  Dirs[a_index]:=A_LoopFileDir
  SB_SetText("Сканирование...`t" a_index " скриптов")
}
SB_SetText("Найдено " names.maxindex() " скриптов")

loop,% names.maxindex()
{
  if (Dirs[a_index]!=olddir)
    LV_Add(,Dirs[a_index],names[a_index])
  else
    LV_Add(,,names[a_index])
  olddir:=Dirs[a_index]
}
LV_ModifyCol()
return

guiclose:
exitapp

ScriptsList:
if (A_GuiEvent="DoubleClick")
{
  run,% ahkPath "\AutoHotkeyU32.exe """ paths[A_EventInfo] """",,UseErrorLevel
  if !errorlevel
    exitapp
  else
    msgbox,Ошибка.
}
return

...

С сортировкой нужно разобраться.

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

59

Re: AHK: Выполнение переменного кода

По мне так, гуи только тормозит работу с файлами.

60 (изменено: Alectric, 2017-12-15 17:14:25)

Re: AHK: Выполнение переменного кода

Зато не нужно плодить кучу файлов, заниматься бесконечной компиляцией, и плодить ссылки на области памяти.

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

61

Re: AHK: Выполнение переменного кода

Про какую компиляцию речь?
Один раз надо скомпилировать один скрипт.
Какие ссылки в области памяти вы имеете в виду?
Скомпилированный экзешник запустил обработчик и выгрузился из памяти.

62 (изменено: Alectric, 2017-12-15 17:32:03)

Re: AHK: Выполнение переменного кода

Malcev пишет:

Какие ссылки в области памяти вы имеете в виду?

Имею ввиду Junction. И не в области, а на.

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

63

Re: AHK: Выполнение переменного кода

Мне это ни о чем не говорит.
Но я только что запустил 1000 скомпилированных скриптов с кодом tooltip - никаких негативных последствий от

плодить ссылки на области памяти

не обнаружил.

64 (изменено: Alectric, 2017-12-15 18:00:41)

Re: AHK: Выполнение переменного кода

Я не про последствия, я про рутину.

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

65

Re: AHK: Выполнение переменного кода

Что происходит? http://i.smiles2k.net/icq_smiles/5.gif

66 (изменено: Alectric, 2017-12-15 18:03:47)

Re: AHK: Выполнение переменного кода

ypppu, у меня тот же вопрос возник, когда я прочитал эту тему. Видимо зачарованное название темы, вдумайтесь только "Выполнение переменного кода". Это как обсуждать переменный ток (если есть электрики), можно обсуждать бесконечно.

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

67 (изменено: svoboden, 2018-04-28 04:11:30)

Re: AHK: Выполнение переменного кода

Тоже заинтересовался данной темой. Пришел к тому, что ahk все же должен быть установлен. Вот так, например, можно выполнить любой код в блокноте, не создавая никаких файлов:

F1::
		ControlGetFocus, ControlName, ahk_exe notepad.exe
		if (InStr(ControlName, "Edit1"))
		{
			ControlGetText, ScriptText, %ControlName%, ahk_exe notepad.exe
			RunTempScript(ScriptText, "Unsaved Script - " A_TickCount)
		}
return

RunTempScript(TempScript, name="")
{
	If name =
	pipe_name := A_TickCount
	Else
	pipe_name := name
	pipe_ga := CreateNamedPipe(pipe_name, 2)
	pipe    := CreateNamedPipe(pipe_name, 2)
	if (pipe=-1 or pipe_ga=-1)
	{
		MsgBox CreateNamedPipe failed.
		ExitApp
	}
	Run, %A_AhkPath% "\\.\pipe\%pipe_name%",,,PID
	DllCall("ConnectNamedPipe","uint",pipe_ga,"uint",0)
	DllCall("CloseHandle","uint",pipe_ga)
	DllCall("ConnectNamedPipe","uint",pipe,"uint",0)
	Script := chr(0xfeff) TempScript
	if !DllCall("WriteFile","uint",pipe,"str",Script,"uint",(StrLen(Script)+1)*2,"uint*",0,"uint",0)
		MsgBox WriteFile failed: %ErrorLevel%/%A_LastError%
	DllCall("CloseHandle","uint",pipe)
	Return PID
}

CreateNamedPipe(Name, OpenMode=3, PipeMode=0, MaxInstances=255)
{
    return DllCall("CreateNamedPipe","str","\\.\pipe\" Name,"uint",OpenMode
        ,"uint",PipeMode,"uint",MaxInstances,"uint",0,"uint",0,"uint",0,"uint",0)
}

68

Re: AHK: Выполнение переменного кода

Diman_Express пишет:

что если скачивать файл с сервера (текстовик), где будет код. Далее скрипт должен прочитать его и выполнить

Подозреваю, на форуме есть примеры этой процедуры, но не знаю, как правильно искать. Есть действенный вариант такого метода чтения кода онлайн из Google Docs, например? Ткните, пожалуйста. Гугл выдал пару примеров некоторой давности - у меня не сработали.

Win10x64, AHK v1.1.25

69 (изменено: Malcev, 2018-04-28 13:17:40)

Re: AHK: Выполнение переменного кода

В справке всё написано:
https://autohotkey.com/docs/commands/Run.htm

code := "msgbox 1`nmsgbox 2"
ExecScript(code, false)

ExecScript(Script, Wait:=true)
{
    shell := ComObjCreate("WScript.Shell")
    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")
    exec.StdIn.Write(script)
    exec.StdIn.Close()
    if Wait
        return exec.StdOut.ReadAll()
}

70

Re: AHK: Выполнение переменного кода

Кстати, такой код не всегда годится:

code := "msgbox ✓"
ExecScript(code, false)

ExecScript(Script, Wait:=true)
{
    shell := ComObjCreate("WScript.Shell")
    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")
    exec.StdIn.Write(script)
    exec.StdIn.Close()
    if Wait
        return exec.StdOut.ReadAll()
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

71 (изменено: Malcev, 2018-04-29 00:10:58)

Re: AHK: Выполнение переменного кода

Да, такие символы wscript похоже не понимает.
Можно конвертировать:

code := "msgbox % Chr(10003)"
ExecScript(code, false)

ExecScript(Script, Wait:=true)
{
    shell := ComObjCreate("WScript.Shell")
    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")
    exec.StdIn.Write(script)
    exec.StdIn.Close()
    if Wait
        return exec.StdOut.ReadAll()
}

Или через именованные каналы:

code := "msgbox ✓"
DynaRun(code)

DynaRun(TempScript, pipename="")
{
   static _:="uint",@:="Ptr"
   If pipename =
      name := "AHK" A_TickCount
   Else
      name := pipename
   __PIPE_GA_ := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,2,_,0,_,255,_,0,_,0,@,0,@,0)
   __PIPE_    := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,2,_,0,_,255,_,0,_,0,@,0,@,0)
   if (__PIPE_=-1 or __PIPE_GA_=-1)
      Return 0
   Run, %A_AhkPath% "\\.\pipe\%name%",,UseErrorLevel HIDE, PID
   If ErrorLevel
      MsgBox, 262144, ERROR,% "Could not open file:`n" __AHK_EXE_ """\\.\pipe\" name """"
   DllCall("ConnectNamedPipe",@,__PIPE_GA_,@,0)
   DllCall("CloseHandle",@,__PIPE_GA_)
   DllCall("ConnectNamedPipe",@,__PIPE_,@,0)
   script := (A_IsUnicode ? chr(0xfeff) : (chr(239) . chr(187) . chr(191))) TempScript
   if !DllCall("WriteFile",@,__PIPE_,"str",script,_,(StrLen(script)+1)*(A_IsUnicode ? 2 : 1),_ "*",0,@,0)
        Return A_LastError,DllCall("CloseHandle",@,__PIPE_)
   DllCall("CloseHandle",@,__PIPE_)
   Return PID
}

72

Re: AHK: Выполнение переменного кода

Malcev пишет:

Можно конвертировать

В этом нет смысла, код, как правило, заранее неизвестен.

Или через именованные каналы

Так это понятно, я просто хотел сказать, что данный код из хелпа не всегда годится.

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

73

Re: AHK: Выполнение переменного кода

teadrinker пишет:

я просто хотел сказать, что данный код из хелпа не всегда годится.

Наверное стоило бы на этот момент в хелпе заострить внимание (сделать пометку).

74

Re: AHK: Выполнение переменного кода

Пиши lexikos'у.

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

75

Re: AHK: Выполнение переменного кода

Написал, посмотрим, что ответит.