Войти

Показать полную графическую версию : [решено] Как просматривать ресурсы при помощи AutoIt


Страниц : [1] 2

Pavluha
17-07-2010, 14:03
Скажите, пожалуйста, можно ли просматривать нестандартные ресурсы типа "RCDATA" или другие нестандартные при помощи AutoIt. Если да, напишите скрипт. Заранее спасибо.

beve
17-07-2010, 16:13
Посмотри этот скрипт: http://autoit.pri.ee/downloads/au3/virtuaalmasin1/ResourcesViewerAndCompiler.au3

Creat0R
17-07-2010, 16:24
FileGetVersion (http://www.autoitscript.com/autoit3/docs/functions/FileGetVersion.htm) возвращает некоторые ресурсы.

Pavluha
18-07-2010, 11:26
beve, этот скрипт великоват и мне нужна только функция просмотра ресурсов, а не новый Resource Hacker.
Creat0R, функция FileGetVersion возвращает только версию файла.

Creat0R
18-07-2010, 16:17
функция FileGetVersion возвращает только версию файла »
Не только, читайте справку.

Iska
20-07-2010, 17:17
Судя по всему, надо опять указать на то, что следует пользовать оригинальную, английскую версию справки :).

Pavluha
08-08-2010, 13:50
Creat0R, тогда дайте пример

madmasles
08-08-2010, 14:56
тогда дайте пример »
Примерно так:#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <Array.au3>

Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aString[14] = ['Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', _
'ProductVersion', 'FileDescription', 'LegalTrademarks', 'PrivateBuild', 'FileVersion', _
'OriginalFilename', 'SpecialBuild', 'CompiledScript', 'DefaultLangCodepage']
$j = 0
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aInfo[1][2]
$sMyExe = 'Explorer.exe'

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aString) - 1
$sResult = FileGetVersion (http://www.autoitscript.com/autoit3/docs/functions/FileGetVersion.htm)($sMyExe, $aString[$i])
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sResult Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$j += 1
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $aInfo[UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aInfo) + 1][2]
$aInfo[$j][0] = $aString[$i]
$aInfo[$j][1] = $sResult
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$aInfo[0][0] = 'Получено ' & UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aInfo) - 1 & ' строк информации.'
_ArrayDisplay (http://dundats.mvps.org/help/html/libfunctions/_arraydisplay.htm)($aInfo, 'Результат.')

Creat0R
08-08-2010, 15:00
тогда дайте пример »

;$sFile = @WindowsDir & "\Notepad.exe"
;$sFile = @WindowsDir & "\Explorer.exe"
;$sFile = @ScriptFullPath
$sFile = @AutoItExe (http://www.autoitscript.com/autoit3/docs/macros.htm#@autoitexe)

$sResourses = _
'Comments,InternalName,ProductName,CompanyName,LegalCopyright,ProductVersion,FileDescription,LegalTr ademarks,PrivateBuild,FileVersion,OriginalFilename,SpecialBuild,' & _
'CompiledScript,DefaultLangCodepag'

$aResources = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)($sResourses, ',')

$sData = ''
$iBig = 0

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aResources[0]
$sVersion = FileGetVersion (http://www.autoitscript.com/autoit3/docs/functions/FileGetVersion.htm)($sFile, $aResources[$i])

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sVersion = "" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sVersion = "N/A"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

$sData &= StringFormat (http://www.autoitscript.com/autoit3/docs/functions/StringFormat.htm)("%-60.60s\t= %50s\n", $aResources[$i], $sVersion)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, 'Resources', $sData)

Pavluha
08-08-2010, 16:55
madmasles, Creat0R, вы не правильно поняли. Мне не надо информацию, которая находится в секции "Version". Мне бы функцию вида:

Func _resRead($restype,$resname,$rescodepage)
;код
Endfunc

Где $restype - тип ресурса (например "string table" или другой),$resname - имя ресурса,$rescodepage - кодовая страница (например 0 - стандартный)

Creat0R
08-08-2010, 18:52
вы не правильно поняли »
Это вы неправильно описали свою проблему, нужно уточнять такие подробности при созданий темы.

Мне бы функцию вида »
http://www.autoitscript.com/forum/index.php?showtopic=51103

P.S
beve дал вам ссылку кажется на эту же библиотеку, стоит на неё взглянуть.

Pavluha
14-08-2010, 15:37
Creat0R, я заглянул на указанную вам ссылку, но не разобрался. Не работает. Дайте пример.

Creat0R
14-08-2010, 16:38
Дайте пример »
По идее вот эта функция должна подойти:

Func _ResourceGetAsRaw($iResType, $iResName, $iResLang, $sModule, $iMode = 0, $iSize = 0)
Local $iLoaded
Local $a_hCall = DllCall("kernel32.dll", "hwnd", "GetModuleHandleW", "wstr", $sModule)

If @error Then
Return SetError(1, 0, "")
EndIf

If Not $a_hCall[0] Then
$a_hCall = DllCall("kernel32.dll", "hwnd", "LoadLibraryExW", "wstr", $sModule, "hwnd", 0, "int", 34)
If @error Or Not $a_hCall[0] Then
Return SetError(2, 0, "")
EndIf
$iLoaded = 1
EndIf

Local $hModule = $a_hCall[0]

Switch IsNumber($iResType) + 2 * IsNumber($iResName)
Case 0
$a_hCall = DllCall("kernel32.dll", "hwnd", "FindResourceExW", _
"hwnd", $hModule, _
"wstr", $iResType, _
"wstr", $iResName, _
"int", $iResLang)
Case 1
$a_hCall = DllCall("kernel32.dll", "hwnd", "FindResourceExW", _
"hwnd", $hModule, _
"int", $iResType, _
"wstr", $iResName, _
"int", $iResLang)
Case 2
$a_hCall = DllCall("kernel32.dll", "hwnd", "FindResourceExW", _
"hwnd", $hModule, _
"wstr", $iResType, _
"int", $iResName, _
"int", $iResLang)
Case 3
$a_hCall = DllCall("kernel32.dll", "hwnd", "FindResourceExW", _
"hwnd", $hModule, _
"int", $iResType, _
"int", $iResName, _
"int", $iResLang)
EndSwitch

If @error Or Not $a_hCall[0] Then
If $iLoaded Then
Local $a_iCall = DllCall("kernel32.dll", "int", "FreeLibrary", "hwnd", $hModule)
If @error Or Not $a_iCall[0] Then
Return SetError(7, 0, "")
EndIf
EndIf
Return SetError(3, 0, "")
EndIf

Local $hResource = $a_hCall[0]

Local $a_iCall = DllCall("kernel32.dll", "int", "SizeofResource", "hwnd", $hModule, "hwnd", $hResource)

If @error Or Not $a_iCall[0] Then
If $iLoaded Then
Local $a_iCall = DllCall("kernel32.dll", "int", "FreeLibrary", "hwnd", $hModule)
If @error Or Not $a_iCall[0] Then
Return SetError(7, 0, "")
EndIf
EndIf
Return SetError(4, 0, "")
EndIf

Local $iSizeOfResource = $a_iCall[0]

$a_hCall = DllCall("kernel32.dll", "hwnd", "LoadResource", "hwnd", $hModule, "hwnd", $hResource)

If @error Or Not $a_hCall[0] Then
If $iLoaded Then
Local $a_iCall = DllCall("kernel32.dll", "int", "FreeLibrary", "hwnd", $hModule)
If @error Or Not $a_iCall[0] Then
Return SetError(7, 0, "")
EndIf
EndIf
Return SetError(5, 0, "")
EndIf

Local $a_pCall = DllCall("kernel32.dll", "ptr", "LockResource", "hwnd", $a_hCall[0])

If @error Or Not $a_pCall[0] Then
If $iLoaded Then
Local $a_iCall = DllCall("kernel32.dll", "int", "FreeLibrary", "hwnd", $hModule)
If @error Or Not $a_iCall[0] Then
Return SetError(7, 0, "")
EndIf
EndIf
Return SetError(6, 0, "")
EndIf

Local $tOut
Switch $iMode
Case 0
$tOut = DllStructCreate("char[" & $iSizeOfResource + 1 & "]", $a_pCall[0])
Case 1
$tOut = DllStructCreate("byte[" & $iSizeOfResource & "]", $a_pCall[0])
EndSwitch

Local $sReturnData = DllStructGetData($tOut, 1)

If $iLoaded Then
Local $a_iCall = DllCall("kernel32.dll", "int", "FreeLibrary", "hwnd", $hModule)
If @error Or Not $a_iCall[0] Then
Return SetError(7, 0, "")
EndIf
EndIf

Switch $iSize
Case 0
Return SetError(0, 0, $sReturnData)
Case Else
Switch $iMode
Case 0
Return SetError(0, 0, StringLeft($sReturnData, $iSize))
Case 1
Return SetError(0, 0, BinaryMid($sReturnData, 1, $iSize))
EndSwitch
EndSwitch
EndFunc

но у меня не получается её использовать, возможно я не тее параметры ввожу.

Pavluha
14-08-2010, 17:02
Creat0R, так у меня тоже не получается. Не понимаю, где тут путь к файлу указывать надо?

Creat0R
14-08-2010, 17:20
где тут путь к файлу указывать надо? »
В «$sModule».

Yashied
14-08-2010, 19:38
_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов, в том числе и для RCDATA. Для строк, иконок, меню и т.д. есть свои собственные функции (http://msdn.microsoft.com/en-us/library/ms632583%28VS.85%29.aspx), которые и нужно использовать. Универсальной функции нет. Например, для получения строки есть _WinAPI_LoadString(), для иконок - _WinAPI_ExtractIcon(), для VersionInfo - _WinAPI_VerQueryValue(), которая реализована в WinAPIEx.au3 (http://autoit-script.ru/index.php/topic,47.0.html) или родной FileGetVersion() и.т.д.

Pavluha
17-08-2010, 14:53
_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов »
Вот как раз мне и нужна эта функция, но почему-то вместо текста я получаю код ошибки 3. Может что-то неправильно ввожу.

Yashied
17-08-2010, 15:33
Скажите, пожалуйста, можно ли просматривать ресурсы типа "string"...»

_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов...[/post]
Вот как раз мне и нужна эта функция »

Как все это нужно понимать?

Pavluha
17-08-2010, 18:26
Yashied, я при написании темы не знал, что нет универсальной функции для просмотра любых ресурсов. Я просто дал пример. Тему исправил.

Pavluha
22-08-2010, 12:08
Creat0R, для чего $iMode, $iSize в вашем приведённом скрипте.




© OSzone.net 2001-2012