Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как просматривать ресурсы при помощи AutoIt (http://forum.oszone.net/showthread.php?t=180788)

Pavluha 17-07-2010 14:03 1454966

Как просматривать ресурсы при помощи AutoIt
 
Скажите, пожалуйста, можно ли просматривать нестандартные ресурсы типа "RCDATA" или другие нестандартные при помощи AutoIt. Если да, напишите скрипт. Заранее спасибо.

beve 17-07-2010 16:13 1455030

Посмотри этот скрипт: http://autoit.pri.ee/downloads/au3/v...ndCompiler.au3

Creat0R 17-07-2010 16:24 1455037

FileGetVersion возвращает некоторые ресурсы.

Pavluha 18-07-2010 11:26 1455415

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

Creat0R 18-07-2010 16:17 1455533

Цитата:

Цитата Pavluha
функция FileGetVersion возвращает только версию файла »

Не только, читайте справку.

Iska 20-07-2010 17:17 1456781

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

Pavluha 08-08-2010 13:50 1469305

Creat0R, тогда дайте пример

madmasles 08-08-2010 14:56 1469343

Цитата:

Цитата Pavluha
тогда дайте пример »

Примерно так:
Код:

#include <Array.au3>

Dim $aString[14] = ['Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', _
        'ProductVersion', 'FileDescription', 'LegalTrademarks', 'PrivateBuild', 'FileVersion', _
        'OriginalFilename', 'SpecialBuild', 'CompiledScript', 'DefaultLangCodepage']
$j = 0
Dim $aInfo[1][2]
$sMyExe = 'Explorer.exe'

For $i = 0 To UBound($aString) - 1
    $sResult = FileGetVersion($sMyExe, $aString[$i])
    If $sResult Then
        $j += 1
        ReDim $aInfo[UBound($aInfo) + 1][2]
        $aInfo[$j][0] = $aString[$i]
        $aInfo[$j][1] = $sResult
    EndIf
Next
$aInfo[0][0] = 'Получено ' & UBound($aInfo) - 1 & ' строк информации.'
_ArrayDisplay($aInfo, 'Результат.')


Creat0R 08-08-2010 15:00 1469344

Цитата:

Цитата Pavluha
тогда дайте пример »

Код:

;$sFile = @WindowsDir & "\Notepad.exe"
;$sFile = @WindowsDir & "\Explorer.exe"
;$sFile = @ScriptFullPath
$sFile = @AutoItExe

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

$aResources = StringSplit($sResourses, ',')

$sData = ''
$iBig = 0

For $i = 1 To $aResources[0]
    $sVersion = FileGetVersion($sFile, $aResources[$i])

    If $sVersion = "" Then
        $sVersion = "N/A"
    EndIf

    $sData &= StringFormat("%-60.60s\t= %50s\n", $aResources[$i], $sVersion)
Next

MsgBox(64, 'Resources', $sData)


Pavluha 08-08-2010 16:55 1469401

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

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

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

Creat0R 08-08-2010 18:52 1469465

Цитата:

Цитата Pavluha
вы не правильно поняли »

Это вы неправильно описали свою проблему, нужно уточнять такие подробности при созданий темы.

Цитата:

Цитата Pavluha
Мне бы функцию вида »

http://www.autoitscript.com/forum/in...howtopic=51103

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

Pavluha 14-08-2010 15:37 1473603

Creat0R, я заглянул на указанную вам ссылку, но не разобрался. Не работает. Дайте пример.

Creat0R 14-08-2010 16:38 1473634

Цитата:

Цитата Pavluha
Дайте пример »

По идее вот эта функция должна подойти:

Код:

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 1473649

Creat0R, так у меня тоже не получается. Не понимаю, где тут путь к файлу указывать надо?

Creat0R 14-08-2010 17:20 1473661

Цитата:

Цитата Pavluha
где тут путь к файлу указывать надо? »

В «$sModule».

Yashied 14-08-2010 19:38 1473725

_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов, в том числе и для RCDATA. Для строк, иконок, меню и т.д. есть свои собственные функции, которые и нужно использовать. Универсальной функции нет. Например, для получения строки есть _WinAPI_LoadString(), для иконок - _WinAPI_ExtractIcon(), для VersionInfo - _WinAPI_VerQueryValue(), которая реализована в WinAPIEx.au3 или родной FileGetVersion() и.т.д.

Pavluha 17-08-2010 14:53 1475563

Цитата:

Цитата Yashied
_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов »

Вот как раз мне и нужна эта функция, но почему-то вместо текста я получаю код ошибки 3. Может что-то неправильно ввожу.

Yashied 17-08-2010 15:33 1475588

Цитата:

Цитата Pavluha
Скажите, пожалуйста, можно ли просматривать ресурсы типа "string"...»

Цитата:

Цитата Pavluha
Цитата:

Цитата Yashied
_ResourceGetAsRaw() нужно использовать только для нестандартных ресурсов...[/post]

Вот как раз мне и нужна эта функция »

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

Pavluha 17-08-2010 18:26 1475720

Yashied, я при написании темы не знал, что нет универсальной функции для просмотра любых ресурсов. Я просто дал пример. Тему исправил.

Pavluha 22-08-2010 12:08 1479175

Creat0R, для чего $iMode, $iSize в вашем приведённом скрипте.

Pavluha 18-09-2010 13:44 1498470

Пожалуйста, помогите решить эту задачу! Позарез нужен скрипт для просмотра ресурсов.

Yashied 18-09-2010 15:28 1498538

Проще уже некуда.

Код:

#Include <WinAPIEx.au3>

$hInstance = _WinAPI_LoadLibrary(@SystemDir & '\shell32.dll')
$hResource = _WinAPI_FindResource($hInstance, 'AVI', 150)
$iSize = _WinAPI_SizeofResource($hInstance, $hResource)
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)

; Сейчас $pData содержит указатель непосредственно на ресурс, в данном случае "AVI" с названием 150, $iSize - его размер в байтах
; Делай с ними что хочешь, например, можно сохранить в файл

$hFile = FileOpen(@ScriptDir & '\150.avi', 2 + 16)
$tData = DllStructCreate('byte[' & $iSize & ']', $pData)
FileWrite($hFile, DllStructGetData($tData, 1))
FileClose($hFile)

_WinAPI_FreeLibrary($hInstance)

WinAPIEx.au3

Pavluha 19-09-2010 11:32 1498943

Цитата:

Цитата Yashied
Проще уже некуда. »

Только вместо $hResource = _WinAPI_FindResource($hInstance, 'AVI', 150) надо $hResource = _WinAPI_FindResource($hInstance, 150, 'AVI')

Ещё вопрос не в тему: можно ли записывать в файл ресурсы? Если да то как? Напишите скрипт. Заранее благодарен.

Pavluha 23-09-2010 18:22 1502738

Хотя нужна ещё вот такая функция: нужно получить список ресурсов типа 'rcdata', т. е. какие имена ресурсов есть в 'rcdata'

Yashied 23-09-2010 22:03 1502880

Цитата:

Цитата Pavluha
Хотя нужна ещё вот такая функция: нужно получить список ресурсов типа 'rcdata', т. е. какие имена ресурсов есть в 'rcdata' »

_WinAPI_EnumResourceNames()

Pavluha 29-09-2010 18:40 1507560

Хорошо. А как записывать ресурсы в файл?

Pavluha 02-10-2010 16:12 1509671

А как удалять?

Creat0R 05-03-2011 16:20 1627940

Цитата:

Цитата Pavluha
А как записывать ресурсы в файл? »

Цитата:

Цитата Pavluha
А как удалять? »

Это уже другие вопросы, прошу в отдельные темы.


Время: 08:00.

Время: 08:00.
© OSzone.net 2001-