FileExtract

作者: Lexikos 最近更新时间: nonexistent


FileExtract / FileExtract_ToMem (counterpart of FileInstall)

FileExtract: Extracts a file from this compiled script by using a dynamic FileInstall.
FileExtract_ToMem: Extracts a FileInstall'd file into memory without writing it to disk.

Modify a line of script at run-time to allow variable references in the source parameter of FileInstall, and prevent Ahk2Exe from interpreting it. (Turn FileCopy into FileInstall.)
Use machine code (compiled C++) to achieve multi-threading. (Read from the pipe while FileInstall is writing to it.)

FileExtract( Source, Dest [, Flag ] )
FileExtract_(Source, Dest, Flag)
FileExtract_ToMem( Source, pData, DataSize [, InitialBufferSize, InitialBuffer ] )

关于函数的参数和返回值, 请参阅其源码.

备注

关于此函数(集)的更新细节和注意事项, 请参见 AutoHotkey 论坛: http://www.autohotkey.com/forum/viewtopic.php?t=30088

许可

此函数(集)是基于 Public Domain 许可的开源项目. 想了解许可详情, 请参见 lexikos-license.txt

示例

; #Include FileExtract.ahk
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

; Self-compiling Example Script (not Unicode-compatible) by Lexikos

if !A_IsCompiled
{   ; Self-compile-and-run.
    RunWait, %A_AhkPath%\..\Compiler\Ahk2Exe.exe /in "%A_ScriptFullPath%"
    Run % SubStr(A_ScriptFullPath, 1, InStr(A_ScriptFullPath,".",1,0)-1) ".exe"
    ExitApp
   
    ; Not executed by AutoHotkey, but interpreted by Ahk2Exe:
    FileInstall, FileExtract_Demo.ahk, ~
}

Menu, Tray, MainWindow

VarSetCapacity(important, 40, Asc("="))
GuiOut(important " Actual Script")

; Initialize pData since it has no value yet:
pData := 0
; DataSize specifies the desired initial size of the buffer, or zero for "don't care".
DataSize := 0

; The script itself is either >AUTOHOTKEY SCRIPT< or >AHK WITH ICON<.
if FileExtract_ToMem(">AUTOHOTKEY SCRIPT<", pData, DataSize)
    || FileExtract_ToMem(">AHK WITH ICON<", pData, DataSize)
{   ; Show the string data in a GUI.
    GuiOut(GetStrN(pData, DataSize))
}
else
{   ; Note: At this point, AutoHotkey has probably already shown an error dialog.
    GuiOut("-- Failed! --")
}

GuiOut(important " FileExtract_Demo.ahk")

; Extract a FileInstall'd file.
if FileExtract_ToMem("FileExtract_Demo.ahk", pData, DataSize)
{
    GuiOut(GetStrN(pData, DataSize))
}
else
{
    GuiOut("-- Failed! --")
}

; Free the buffer.
DllCall("GlobalFree", "uint", pData)

return

GuiOut(Text, GuiNum=37) {
    static GuiText
    Gui, %GuiNum%: Default
    if (GuiText = "") {
        GuiText := Text "`n"
        Gui, Font,, Courier New
        Gui, Add, Edit, ReadOnly W600 H400, %GuiText%
    } else
        GuiControl,, Edit1, % GuiText .= Text "`n"
    Gui, Show
    Gui, +LastFound +LabelGuiOut
    ControlSend, Edit1, ^{End}
    return
    GuiOutClose:
    GuiOutEscape:
    ExitApp
}

GetStrN(Pointer, Length) {
    VarSetCapacity(String, Length)
    DllCall("lstrcpyn", "str", String, "uint", Pointer, "int", Length+1)
    return String
}