Небольшая солянка из забугорных поделок, с которыми можно ознакомиться по ссылкам из секции "Credits":
; ======================================================================================================================
; Credits: Bitmap creation is based on "How to convert Image data (JPEG/PNG/GIF) to hBITMAP?" by SKAN ->
; http://www.autohotkey.com/board/topic/21213-how-to-convert-image-data-jpegpnggif-to-hbitmap/?p=139257
; Подробный пример получения RCData при упаковке 'FileInstall' от Just Me
; https://autohotkey.com/boards/viewtopic.php?f=11&t=2101&hilit=RCDATA
; Image2Include - запись изображения строкой от Just Me
; https://autohotkey.com/board/topic/93292-image2include-include-images-in-your-scripts/
; Include virtually any file in a script (exe/zip/dll/etc....) от Rseding91
; https://autohotkey.com/board/topic/64481-include-virtually-any-file-in-a-script-exezipdlletc/
; ======================================================================================================================
; This software is provided 'as-is', without any express or implied warranty.
; In no event will the authors be held liable for any damages arising from the use of this software.
; ======================================================================================================================
SetBatchLines -1
#NoEnv
#SingleInstance, Force
GoSub, Start
; ----------------------------------------------------------------------------------------------------------------------
Global insertedItems
bttn_w := 120, bttn_h := 45
; ======================================================================================================================
; нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
; ======================================================================================================================
Menu Tray, Icon, shell32.dll, 190
Gui,+OwnDialogs +HWNDmain_h
Gui,1: Margin, 10, 10
Gui,1: Add, CheckBox,vtoMemory +Checked,Для загрузки в память и получения указателя
Gui,1: Add, CheckBox,xm y+5 vtoRestore,С возможностью восстановления
Gui,1: Add, Button, gConvert xm y+10 w%bttn_w% h%bttn_h%,В файл
Gui,1: Add, Button, gCopy_Clip x+30 w%bttn_w% h%bttn_h%,В буфер
Gui,1: Font, s42 w600
Gui,1: Add, Text, x+30 yp-5 w170 h105 +0x801000 +0x200 vfileCounter Center,0
Gui,1: Font
Gui,1: Add, Button, gRestartWork xm yp+55 w%bttn_w% h%bttn_h%,Новый
Gui,1: Add, Button, gShow x+30 w%bttn_w% h%bttn_h%,Посмотреть код
Gui,1: Add, StatusBar
Gui,1: Show,,File-Converter/Lib-Creator
Gui, Script: +Owner1
Gui, Script: Margin, 5, 5
Gui, Script: Font, , Courier New
Gui, Script: Add, Edit, x0 y0 w0 h0
Gui, Script: Add, Edit, % "x0 y0 w" . Round(A_ScreenWidth * 0.8) . " h" . Round(A_ScreenHeight * 0.8)
. " vScriptEdit +hwndHEdit +HScroll"
Gui, Script: Add, StatusBar
; ======================================================================================================================
Gosub, RestartWork
; ======================================================================================================================
Return
; ----------------------------------------------------------------------------------------------------------------------
GuiClose:
ExitApp
; ----------------------------------------------------------------------------------------------------------------------
ScriptGuiEscape:
Gui,Script: Show, Hide
return
RestartWork:
GuiControl,Enable,toMemory
GuiControl,Enable,toRestore
outFileName := "", insertedItems := []
memTmp := "", resTmp := ""
textFile := "", varInitText := "", ttlFile := 0
GuiControl,Text,fileCounter,0
SB_SetText("Перетащите файлы на это окно.")
return
; ----------------------------------------------------------------------------------------------------------------------
Begin:
; -------------------------------------------------------------------------------------------------------------------
; Чтение изображения
; -------------------------------------------------------------------------------------------------------------------
File := FileOpen(ImgFile, "r")
BinLen := File.Length
File.RawRead(Bin, BinLen)
File.Close()
; -------------------------------------------------------------------------------------------------------------------
; Размер файла
; -------------------------------------------------------------------------------------------------------------------
Ptr := A_IsUnicode ? "Ptr" : "UInt"
, H := DllCall("CreateFile", Ptr, &ImgFile, "UInt", 0x80000000, "UInt", 3, "UInt", 0, "UInt", 3, "UInt", 0, "UInt", 0)
, VarSetCapacity(FileSize, 8, 0)
, DllCall("GetFileSizeEx", Ptr, H, "Int64*", FileSize)
, DllCall("CloseHandle", Ptr, H)
; -------------------------------------------------------------------------------------------------------------------
; Преобразование в текст
; -------------------------------------------------------------------------------------------------------------------
DllCall("Crypt32.dll\CryptBinaryToString", "Ptr", &Bin, "UInt", BinLen, "UInt", 0x01, "Ptr", 0, "UIntP", B64Len)
VarSetCapacity(B64, B64Len << !!A_IsUnicode, 0)
DllCall("Crypt32.dll\CryptBinaryToString", "Ptr", &Bin, "UInt", BinLen, "UInt", 0x01, "Ptr", &B64, "UIntP", B64Len)
Bin := ""
VarSetCapacity(Bin, 0)
VarSetCapacity(B64, -1)
B64 := RegExReplace(B64, "\r\n")
B64Len := StrLen(B64)
; -------------------------------------------------------------------------------------------------------------------
; Запись в скрипт
; -------------------------------------------------------------------------------------------------------------------
PartLength := 16000
CharsRead := 1, Part := "`tB64 := """
if (!toRestore)
varInitText.= Format("; -> {1}_{2} := Retrieve_{1}_{2}()`r`n",name,ext)
else
varInitText.= Format("; -> {1}_{2} := Retrieve_{1}_{2}(""{1}.{2}"")`r`n",name,ext)
textFile.="Retrieve_" name "_" ext "(_Filename := 0, _DumpData := 0, NewHandle := False) {`r`n"
textFile.="`tStatic hBitmap := 0, HasData := 1, Out_Data, Ptr, ExtractedData`r`n"
if (toMemory)
textFile.= Header "`r`n"
textFile.="`tVarSetCapacity(B64, " StrLen(B64) " << !!A_IsUnicode)`r`n"
While (CharsRead < B64Len) {
textFile.=Part SubStr(B64, CharsRead, PartLength) """`r`n"
CharsRead += PartLength
If (CharsRead < B64Len)
Part := "`tB64 .= """
}
if (toRestore)
textFile .= Format(restoreBody, Ceil(FileSize * 1.37), FileSize)
if (toMemory) {
textFile .= "`tif !(hBitmap)`r`n"
If (ext == "ico")
textFile.="`t`thBitmap := H_Func(B64,1) `r`n"
Else
textFile.="`t`thBitmap := H_Func(B64) `r`n"
textFile .= "`treturn hBitmap`r`n}`r`n"
} else
textFile .="}`r`n"
SB_SetText(" >>> " name "." ext " >>> добавлен в сценарий.")
return
Convert:
if (varInitText) {
resultStr:= Format("{1}`r`n`r`n{2}`r`n{3}", varInitText, textFile, toMemory ? H_Func : "")
File := FileOpen(outFileName, "w", "UTF-8")
File.Write(resultStr)
File.Close()
SB_SetText("Файл -> " . outFileName . " >>> Создан")
} else
SB_SetText("Преобразование невозможно. Начальные компоненты сценария не заданы.")
Return
Copy_Clip:
if (varInitText) {
ClipBoard := Format("{1}`r`n{2}{3}", varInitText, textFile, toMemory ? H_Func : "")
SB_SetText("Сценарий -> >>> Скопирован в буфер")
} else
SB_SetText("Копирование невозможно. Начальные компоненты сценария не заданы.")
return
; ======================================================================================================================
; Демонстрация сгенерированного кода
; ======================================================================================================================
Show:
if (varInitText) {
Gui,1: Submit, Nohide
tmpText := textFile
resultStr := Format("{1}`r`n{2}{3}",varInitText,tmpText, toMemory ? H_Func : "")
If (resultStr) {
Size := StrLen(resultStr)
Gui, Script: Default
GuiControl, Text, ScriptEdit,% resultStr
ControlGet, Lines, LineCount, , , ahk_id %HEDIT%
SB_SetText(" Длина: " . Size . " символов. Строк: " . Lines)
Gui,Script: Show,,%outFileName%
}
} else
SB_SetText("Не на что смотреть. Начальные компоненты сценария не заданы.")
Return
; ----------------------------------------------------------------------------------------------------------------------
GuiDropFiles:
Gui,1: Submit, Nohide
if (!toMemory && !toRestore) {
MsgBox,,Отмена,Преобразование не имеет смысла, поскольку производится без цели.`nОтметьте хотя бы один чекбокс.
return
} if (!varInitText) {
GuiControl,Disable,toMemory
GuiControl,Disable,toRestore
}
SplitPath, A_GuiEvent, fullName, OutDir, ext, name
forWrite := []
if (A_EventInfo > 1) { ; Если дропнуло больше одного файла/папки
allItems := []
allItems := StrSplit(A_GuiEvent,"`n")
Loop,% allItems.Length() {
nextItem := allItems[A_Index]
SplitPath, nextItem, fullName, OutDir, ext, name
if (ext == "") { ; Папка
Loop,% nextItem "\*.*",,1
if (CheckItem(A_LoopFileFullPath))
forWrite.Push(A_LoopFileFullPath)
} else if (CheckItem(nextItem))
forWrite.Push(nextItem)
}
} else {
if (ext == "") { ; Папка
Loop,% A_GuiEvent "\*.*",,1
if (CheckItem(A_LoopFileFullPath))
forWrite.Push(A_LoopFileFullPath)
} else if (CheckItem(A_GuiEvent))
forWrite.Push(A_GuiEvent)
} if (forWrite.Length()) {
GoSub, DoInsert
SB_SetText("Запись завершена.")
} else
SB_SetText("Элементы на запись не поступали.")
return
DoInsert:
Loop,% forWrite.Length() {
ImgFile := forWrite[A_Index]
SplitPath,ImgFile,fullName,OutDir,ext,name
name := StrReplace(name, A_Space, "_")
if (!outFileName)
outFileName :=% A_ScriptDir "\Retrieve_" name "_" ext ".ahk"
ttlFile++
GoSub, Begin
GuiControl,Text,fileCounter,% ttlFile
}
return
CheckItem(item) {
Loop,% insertedItems.Length() {
inserted := insertedItems[A_Index]
SplitPath,item,fullItemName
SplitPath,inserted,fullInsertedName
if (fullInsertedName == fullItemName)
return false
} insertedItems.Push(item)
return true
}
Start:
; ----------------------------------------------------------------------------------------------------------------------
Header := "
(Join`r`n
If (NewHandle)
hBitmap := 0
If (hBitmap && !_Filename)
Return hBitmap
)"
; ----------------------------------------------------------------------------------------------------------------------
H_Func := "
(Join`r`n
H_Func(B64,ico:=0) {
If !DllCall(""Crypt32.dll\CryptStringToBinary"", ""Ptr"", &B64, ""UInt"", 0, ""UInt"", 0x01, ""Ptr"", 0, ""UIntP"", DecLen, ""Ptr"", 0, ""Ptr"", 0)
Return False
VarSetCapacity(Dec, DecLen, 0)
If !DllCall(""Crypt32.dll\CryptStringToBinary"", ""Ptr"", &B64, ""UInt"", 0, ""UInt"", 0x01, ""Ptr"", &Dec, ""UIntP"", DecLen, ""Ptr"", 0, ""Ptr"", 0)
Return False
hData := DllCall(""Kernel32.dll\GlobalAlloc"", ""UInt"", 2, ""UPtr"", DecLen, ""UPtr"")
pData := DllCall(""Kernel32.dll\GlobalLock"", ""Ptr"", hData, ""UPtr"")
DllCall(""Kernel32.dll\RtlMoveMemory"", ""Ptr"", pData, ""Ptr"", &Dec, ""UPtr"", DecLen)
DllCall(""Kernel32.dll\GlobalUnlock"", ""Ptr"", hData)
DllCall(""Ole32.dll\CreateStreamOnHGlobal"", ""Ptr"", hData, ""Int"", True, ""PtrP"", pStream)
hGdip := DllCall(""Kernel32.dll\LoadLibrary"", ""Str"", ""Gdiplus.dll"", ""UPtr"")
VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, ""UChar"")
DllCall(""Gdiplus.dll\GdiplusStartup"", ""PtrP"", pToken, ""Ptr"", &SI, ""Ptr"", 0)
DllCall(""Gdiplus.dll\GdipCreateBitmapFromStream"", ""Ptr"", pStream, ""PtrP"", pBitmap)
if (ico)
DllCall(""Gdiplus.dll\GdipCreateHICONFromBitmap"", ""Ptr"", pBitmap, ""PtrP"", hBitmap, ""UInt"", 0)
else
DllCall(""Gdiplus.dll\GdipCreateHBITMAPFromBitmap"", ""Ptr"", pBitmap, ""PtrP"", hBitmap, ""UInt"", 0)
DllCall(""Gdiplus.dll\GdipDisposeImage"", ""Ptr"", pBitmap)
DllCall(""Gdiplus.dll\GdiplusShutdown"", ""Ptr"", pToken)
DllCall(""Kernel32.dll\FreeLibrary"", ""Ptr"", hGdip)
DllCall(NumGet(NumGet(pStream + 0, 0, ""UPtr"") + (A_PtrSize * 2), 0, ""UPtr""), ""Ptr"", pStream)
Return hBitmap
}
)"
restoreBody := "
(Join`r`n
if (_Filename) {
If (!HasData)
Return -1
If (!ExtractedData) {
ExtractedData := True
, Ptr := A_IsUnicode ? ""Ptr"" : ""UInt""
, VarSetCapacity(TD, {1} * (A_IsUnicode ? 2 : 1))
TD := B64
VarSetCapacity(Out_Data, Bytes := {2}, 0)
, DllCall(""Crypt32.dll\CryptStringToBinary"" (A_IsUnicode ? ""W"" : ""A""), Ptr, &TD, ""UInt"", 0, ""UInt"", 1, Ptr, &Out_Data, A_IsUnicode ? ""UIntP"" : ""UInt*"", Bytes, ""Int"", 0, ""Int"", 0, ""CDECL Int"")
, TD := """"
}
IfExist,% _Filename
FileDelete,% _Filename
SplitPath,_Filename,,OutDir
IfNotExist,% OutDir
FileCreateDir,% OutDir
h := DllCall(""CreateFile"", Ptr, &_Filename, ""Uint"", 0x40000000, ""Uint"", 0, ""UInt"", 0, ""UInt"", 4, ""Uint"", 0, ""UInt"", 0)
, DllCall(""WriteFile"", Ptr, h, Ptr, &Out_Data, ""UInt"", {2}, ""UInt"", 0, ""UInt"", 0)
, DllCall(""CloseHandle"", Ptr, h)
If (_DumpData)
VarSetCapacity(Out_Data, {2}, 0)
, VarSetCapacity(Out_Data, 0)
, HasData := 0
}
)"
return
Обработка выполняется над файлами и файлами в папках, перемещённых в окно сценария.
Конвертирует файлы в base64 и генерирует для них код обёрнутый функциями для каждого файла, позволяющий загружать их в память и возвращая указатель.
За это отвечает первый чекбокс. Второй, добавляет возможность восстанавливать файл к исходному состоянию, если передать вызову его функции имя и расширение файла, которые он получит в результате.
Процесс обработки генерирует файл "*.ahk" в UTF-8, который можно запросто подключить через "#Include". Имя, которое получит результирующий файл зависит от имени первого файла, который был обработан и в первых строках будет содержать закомментированные шаблоны вызовов, перечисленных ниже функций, вида: