Показать полную графическую версию : [решено] Как просматривать ресурсы при помощи AutoIt
Скажите, пожалуйста, можно ли просматривать нестандартные ресурсы типа "RCDATA" или другие нестандартные при помощи AutoIt. Если да, напишите скрипт. Заранее спасибо.
Посмотри этот скрипт: http://autoit.pri.ee/downloads/au3/virtuaalmasin1/ResourcesViewerAndCompiler.au3
FileGetVersion (http://www.autoitscript.com/autoit3/docs/functions/FileGetVersion.htm) возвращает некоторые ресурсы.
beve, этот скрипт великоват и мне нужна только функция просмотра ресурсов, а не новый Resource Hacker.
Creat0R, функция FileGetVersion возвращает только версию файла.
функция FileGetVersion возвращает только версию файла »
Не только, читайте справку.
Судя по всему, надо опять указать на то, что следует пользовать оригинальную, английскую версию справки :).
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, 'Результат.')
тогда дайте пример »
;$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)
madmasles, Creat0R, вы не правильно поняли. Мне не надо информацию, которая находится в секции "Version". Мне бы функцию вида:
Func _resRead($restype,$resname,$rescodepage)
;код
Endfunc
Где $restype - тип ресурса (например "string table" или другой),$resname - имя ресурса,$rescodepage - кодовая страница (например 0 - стандартный)
вы не правильно поняли »
Это вы неправильно описали свою проблему, нужно уточнять такие подробности при созданий темы.
Мне бы функцию вида »
http://www.autoitscript.com/forum/index.php?showtopic=51103
P.S
beve дал вам ссылку кажется на эту же библиотеку, стоит на неё взглянуть.
Creat0R, я заглянул на указанную вам ссылку, но не разобрался. Не работает. Дайте пример.
Дайте пример »
По идее вот эта функция должна подойти:
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
но у меня не получается её использовать, возможно я не тее параметры ввожу.
Creat0R, так у меня тоже не получается. Не понимаю, где тут путь к файлу указывать надо?
где тут путь к файлу указывать надо? »
В «$sModule».
_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() и.т.д.
_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов »
Вот как раз мне и нужна эта функция, но почему-то вместо текста я получаю код ошибки 3. Может что-то неправильно ввожу.
Скажите, пожалуйста, можно ли просматривать ресурсы типа "string"...»
_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов...[/post]
Вот как раз мне и нужна эта функция »
Как все это нужно понимать?
Yashied, я при написании темы не знал, что нет универсальной функции для просмотра любых ресурсов. Я просто дал пример. Тему исправил.
Creat0R, для чего $iMode, $iSize в вашем приведённом скрипте.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.