#include <WinAPIEx.au3>
;добавляем файл
_AddRes('test.exe', 'lic.txt', 10, 'lic')
$hmod = _WinAPI_LoadLibraryEx('test.exe')
$resbyte = _GetRes($hmod, 10, 'lic')
_WinAPI_FreeLibrary($hmod)
$bts = BinaryToString($resbyte)
ConsoleWrite($bts & @LF)
;Функция: _AddRes()
;Описание: Добавляет в файл(exe) ресурсы.
;Параметры: $iPathFile - путь к исходному файлу
; $iResFile - путь к файлу(добавляемому ресурсу)
; $RType - тип ресурса
; $sResName - имя ресурса после добавления(под этим именем ресурс будет находится в исполняемом файле)
; $RLanguage - язык ресурса.
;Успех: Возвращает - 0
;-----------------------------------------------------------------------------------------------------------------------------------
Func _AddRes($iPathFile, $iResFile, $RType, $sResName, $RLanguage = 2057)
Local $tBuffer = 0
If $iPathFile = '' Or $iResFile = '' Or $RType = '' Or $sResName = '' Then Return SetError(1, 0, 0)
If StringIsDigit($RType) Then $RType = Number($RType)
If StringIsDigit($sResName) Then $sResName = Number($sResName)
Local $iFileSize = FileGetSize($iResFile)
If @error = 1 Or $iFileSize = 0 Then Return SetError(2, 0, 0)
Local $tfile = DllStructCreate('byte[' & $iFileSize & ']')
If @error <> 0 Then Return SetError(3, @error, 0)
Local $pfile = DllStructGetPtr($tfile)
If $pfile = 0 Then Return SetError(4, @error, 0)
Local $hFile = _WinAPI_CreateFile($iResFile, 2, 2)
If $hFile = 0 Then Return SetError(5, _WinAPI_GetLastError(), 0)
Local $iBytes = 0
If Not _WinAPI_ReadFile($hFile, $pfile, DllStructGetSize($tfile), $iBytes) Then Return SetError(6, _WinAPI_GetLastError(), 0)
If Not _WinAPI_CloseHandle($hFile) Then Return SetError(7, _WinAPI_GetLastError(), 0)
Local $hUpdate = _WinAPI_BeginUpdateResource_($iPathFile)
If Not $hUpdate = 1 Then Return SetError(9, _WinAPI_GetLastError(), 0)
If Not _WinAPI_UpdateResource_($hUpdate, $RType, $sResName, $RLanguage, $pfile, $iBytes) Then Return SetError(10, 0, 0)
If Not _WinAPI_EndUpdateResource_($hUpdate) Then Return SetError(11, _WinAPI_GetLastError(), 0)
EndFunc ;==>_AddRes
;-------------------------------------------------------------------------------------------------------------------------------------
;Функция: _GetRes()
;Описание: Извлекает ресурсы из файла(exe)
;Параметры: $hInstance - дескриптор файла, из которого извлекается ресурс. для получения дескриптора можно использовать _WinAPI_LoadLibraryEx()
; $RType - тип ресурса
; $sResName - имя ресурса
;Успех: Возвращает бинарные данные ресурса.
;--------------------------------------------------------------------------------------------------------------------------------------
Func _GetRes($hInstance, $RType, $sResName)
Local $hRes = _WinAPI_FindResource($hInstance, $RType, $sResName)
If $hRes = 0 Then Return SetError(1, 0, 0)
Local $dSize = _WinAPI_SizeOfResource($hInstance, $hRes)
If $dSize = 0 Then Return SetError(2, 0, 0)
Local $hLoad = _WinAPI_LoadResource($hInstance, $hRes)
If $hLoad = 0 Then Return SetError(3, 0, 0)
Local $pData = _WinAPI_LockResource($hLoad)
If $pData = 0 Then Return SetError(4, 0, 0)
Local $tBuffer = DllStructCreate("byte[" & $dSize & "]")
If @error <> 0 Then Return SetError(5, 0, 0)
_WinAPI_MoveMemory(DllStructGetPtr($tBuffer), $pData, $dSize)
Return DllStructGetData($tBuffer, 1)
EndFunc ;==>_GetRes
Func _WinAPI_BeginUpdateResource_($sFile, $fDelete = 0)
Local $Ret = DllCall('kernel32.dll', 'ptr', 'BeginUpdateResourceW', 'wstr', $sFile, 'int', $fDelete)
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[0]
EndFunc ;==>_WinAPI_BeginUpdateResource_
Func _WinAPI_UpdateResource_($hUpdate, $sType, $sName, $iLanguage, $pData, $iSize)
Local $TypeOfType = 'int', $TypeOfName = 'int'
If IsString($sType) Then
$TypeOfType = 'wstr'
EndIf
If IsString($sName) Then
$TypeOfName = 'wstr'
EndIf
Local $Ret = DllCall('kernel32.dll', 'int', 'UpdateResourceW', 'ptr', $hUpdate, $TypeOfType, $sType, $TypeOfName, $sName, 'ushort', $iLanguage, 'ptr', $pData, 'dword', $iSize)
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_UpdateResource_
Func _WinAPI_EndUpdateResource_($hUpdate, $fDiscard = 0)
Local $Ret = DllCall('kernel32.dll', 'int', 'EndUpdateResourceW', 'ptr', $hUpdate, 'int', $fDiscard)
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_EndUpdateResource_