This is what I used in my Thread() function, a little modified.
It is used to reuse the labels and function in other threads and processes.
Code:
Script:="#NoTrayIcon`nMsgBox randomized script`nLabel:LabelEnd`nFunc{}`nExit:ExitEnd"
RunTempScript(CreateScript(Script),"MyScript")
ExitApp
Label:
;some routines
SetBatchLines,-1
Func("Function Hallo")
Gosub, Exit
LabelEnd:
Return
Exit:
MsgBox Label Exit`nExiting now
ExitApp
ExitEnd:
Return
Func(a){
MsgBox % a
}
CreateScript(script){
static mScript,FileExtract_ToMem:="FileExtract_ToMem"
StringReplace,script,script,`n,`r`n,A
StringReplace,script,script,`r`r,`r,A
If RegExMatch(script,"m)^[^:]+:[^:]+|[a-zA-Z0-9#_@]+\{}$"){
If !(mScript){
If (A_IsCompiled and IsFunc(FileExtract_ToMem)){
MsgBox fileex
pData:=0,DataSize:=0
If (%FileExtract_ToMem%(">AUTOHOTKEY SCRIPT<", pData, DataSize)
|| %FileExtract_ToMem%(">AHK WITH ICON<", pData, DataSize)){
ListVars
MsgBox
VarSetCapacity(mScript,DataSize)
DllCall("lstrcpyn", "str", mScript, "uint", pData, "int", DataSize+1)
VarSetCapacity(mScript,-1)
StringReplace,mScript,mScript,`n,`r`n,A
StringReplace,mScript,mScript,`r`r,`r,A
mScript .="`r`n"
}
} else {
FileRead,mScript,%A_ScriptFullPath%
StringReplace,mScript,mScript,`n,`r`n,A
StringReplace,mScript,mScript,`r`r,`r,A
mScript .= "`r`n"
}
}
Loop,Parse,script,`n,`r
{
If A_LoopField=
Continue
else if A_Index=1
script=
If (RegExMatch(A_LoopField,"^[^:\s]+:[^:\s=]+$")){
StringSplit,label,A_LoopField,:
If (label0=2 and IsLabel(label1) and IsLabel(label2)){
script .=SubStr(mScript
, ErrorLevel:=InStr(mScript,"`r`n" label1 ":`r`n")
, InStr(mScript,"`r`n" label2 ":`r`n")-ErrorLevel) . "`r`n"
}
} else if RegExMatch(A_LoopField,"^[^\{}\s]+\{}$"){
StringTrimRight,label,A_LoopField,2
script .= SubStr(mScript
, h:=RegExMatch(mScript,"i)\R" label "\([^)\R]*\)\R?\{")
, RegExMatch(mScript,"\R\s*}\s*\K\R",1,h)-h) . "`r`n"
} else
script .= A_LoopField "`r`n"
}
}
StringReplace,script,script,`r`n,`n,All
Return Script
}
RunTempScript(TempScript, name="")
{
global #__AHK_EXE_
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.
Return
}
Run %A_AhkPath% "\\.\pipe\%#__PIPE_NAME_%",,UseErrorLevel HIDE, PID
If ErrorLevel
MsgBox, 262144, ERROR,% "Could not open file:`n" #__AHK_EXE_ """\\.\pipe\" #__PIPE_NAME_ """"
DllCall("ConnectNamedPipe","uint",#__PIPE_GA_,"uint",0)
DllCall("CloseHandle","uint",#__PIPE_GA_)
DllCall("ConnectNamedPipe","uint",#__PIPE_,"uint",0)
script := chr(239) . chr(187) . chr(191) . TempScript
if !DllCall("WriteFile","uint",#__PIPE_,"str",script,"uint",StrLen(script)+1,"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)
}