Что нового

Не могу понять что не так. resources.au3 & AutoIt3Wrapper

V

VitAl2013

Гость
Есть такой скрипт:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_File_Add=Z:\HOME\Programs\Programming\AutoIT\pole_for_test\include\formats\gbl_ml_a0_h.frm, RT_RCDATA, frames;_a0_h
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; #Include <WinAPIEx.au3>
#include <resources.au3>
Local $way = "C:\temp\MLS_temp"
Local $list_format = "A0"
Local $position = "horizontal"
_ResSaveToFile($way & "\formats\gbl_ml_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))&".frm", "frames_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1)))
If @error <> 0 Then
   MsgBox (64, "error", "@error <> 0")
EndIf

Local $where = $way&"\formats\gbl_ml_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))&".frm"
Local $what = "frames_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))
   MsgBox (64, "$where/what", "$where = "&$where&@CRLF&"$what = "&$what)
_ResSaveToFile($where, $what)
If @error <> 0 Then
   MsgBox (64, "error2", "@error <> 0")
EndIf

_ResSaveToFile($where, 1)
_ResSaveToFile($where, "1")
_ResSaveToFile($where, 2057)
_ResSaveToFile($where, "2057")
_ResSaveToFile($where, "frames")
; _ResSaveToFile($where, frames)

не работает ни в какую. Глаз замылился, не могу найти ошибку. Мнеб его просто заставить работать бы.

Сначала пытался делать с "_a0_h" и его генерировать в процессе. Потом генерация отдельно. Потом Полез через РесурсХакер и посмотрел как он там лежит - выдал что чемто сжат или както не правильно всунут. ОТключил UPX. Всё равно. Снова РесХак, лезу в RCData, там папка 1 и объект 2057. Имени frames а тем более frames_a0_h нигде нет.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
#AutoIt3Wrapper_Res_File_Add=Z:\HOME\...\gbl_ml_a0_h.frm, RCDATA, FRAMES
 
Автор
V

VitAl2013

Гость
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_File_Add=Z:\HOME\Programs\Programming\AutoIT\pole_for_test\include\formats\gbl_ml_a0_h.frm, RCDATA, frames_a0_h
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <resources.au3>
Local $way = "C:\temp\MLS_temp"
Local $list_format = "A0"
Local $position = "horizontal"
Local $where = $way&"\formats\gbl_ml_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))&".frm"
Local $what = "FRAMES_"&StringUpper($list_format)&"_"&StringUpper(StringLeft($position, 1))

MsgBox (64, "$where/what", "$where = "&$where&@CRLF&"$what = "&$what)

_ResSaveToFile($where, $what)
If @error <> 0 Then
   MsgBox (64, "error", "@error <> 0")
EndIf

Это то, что пытаюсь заставить работать. Не работает. С RCDATA появилась стрктура внутри exe. Папка RCDATA и ресурс FRAMES_A0_H. Пробовал и 32бита компиллер и 64. Скачал последний (?) 2.0.1.4 AutoIt3Wrapper. Что-то отчего-то почему-то нитого.

Yashied
Какой послеедний resource.au3 ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Resources.au3 тут нипричем, видимо проблема в AutoIt3Wrapper'е, когда он пытается запихнуть ресурсы в файл... Я для этого всегда использую ResHacker (пока ни разу не подводил), вот так работает:

Код:
#Region  ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Run_After=...\ResHacker.exe -add %out%, %out%, Z:\HOME\Programs\Programming\AutoIT\pole_for_test\include\formats\gbl_ml_a0_h.frm, RCData, "frames_a0_h", 0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****



Добавлено:
Сообщение автоматически объединено:

Только не забудь поставить правильный путь к ResHacker.exe.

:smile:



Добавлено:
Сообщение автоматически объединено:

Кстати, упростил немного _ResSaveToFile(). Можешь использовать ее без подключения
Resources.au3, но это необязательно.

Код:
#Include <WinAPIEx.au3>

Func _ResSaveToFile($sFile, $iRes)

	Local $hFile, $hInst, $hInfo, $hData, $pData, $tData, $iSize, $iByte

	$hInst = _WinAPI_GetModuleHandle('')
	$hInfo = _WinAPI_FindResource($hInst, $iRes, $RT_RCDATA)
	$hData = _WinAPI_LoadResource($hInst, $hInfo)
	$iSize = _WinAPI_SizeofResource($hInst, $hInfo)
	$pData = _WinAPI_LockResource($hData)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	$tData = DllStructCreate('byte[' & $iSize & ']', $pData)
	$hFile = _WinAPI_CreateFile($sFile, 1)
	If Not $hFile Then
		Return SetError(2, 0, 0)
	EndIf
	_WinAPI_WriteFile($hFile, DllStructGetPtr($tData), $iSize, $iByte)
	_WinAPI_CloseHandle($hFile)
	If $iByte <> $iSize Then
		Return SetError(3, 0, 0)
	EndIf
	Return 1
EndFunc   ;==>_ResSaveToFile
 
Автор
V

VitAl2013

Гость
Он добовлять то добовляет, структура есть - внутрянка соответсвует. Но он раскрывать не хочет.

Может это както быть связаным с тем что у меня 64битый Xeon?

Что за параметр $RT_RCDATA? Может в нём дело.

А вот ResHacker отказывается добавлять файл внутрь.

Использую сейчас вот такой код:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_File_Add=Z:\HOME\Programs\Programming\AutoIT\pole_for_test\include\formats\gbl_ml_a0_h.frm, RCDATA, frames_a0_h
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;#include <resources.au3>
#Include <WinAPIEx.au3>
Local $way = "C:\temp\MLS_temp"
Local $list_format = "A0"
Local $position = "horizontal"
Local $where = $way&"\formats\gbl_ml_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))&".frm"
Local $what = "FRAMES_"&StringUpper($list_format)&"_"&StringUpper(StringLeft($position, 1))

MsgBox (64, "$where/what", "$where = "&$where&@CRLF&"$what = "&$what)

_ResSaveToFile($where, $what)
If @error <> 0 Then
   MsgBox (64, "error", "@error = "& @error)
EndIf

Func _ResSaveToFile($sFile, $iRes)

    Local $hFile, $hInst, $hInfo, $hData, $pData, $tData, $iSize, $iByte

    $hInst = _WinAPI_GetModuleHandle('')
    $hInfo = _WinAPI_FindResource($hInst, $iRes, $RT_RCDATA)
    $hData = _WinAPI_LoadResource($hInst, $hInfo)
    $iSize = _WinAPI_SizeofResource($hInst, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    $tData = DllStructCreate('byte[' & $iSize & ']', $pData)
    $hFile = _WinAPI_CreateFile($sFile, 1)
    If Not $hFile Then
        Return SetError(2, 0, 0)
    EndIf
    _WinAPI_WriteFile($hFile, DllStructGetPtr($tData), $iSize, $iByte)
    _WinAPI_CloseHandle($hFile)
    If $iByte <> $iSize Then
        Return SetError(3, 0, 0)
    EndIf
    Return 1
EndFunc   ;==>_ResSaveToFile
ВОзвращает ошибку 1. Тоесть гдето на
Код:
$pData = _WinAPI_LockResource($hData)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AutoIt3Wrapper у меня тоже глючит относительно RCDATA, поэтому я тебе и посоветовал ResHacker. Я так понимаю, что AutoIt3Wrapper создает раздел с именем "RCDATA", но не являющейся по типу RT_RCDATA. Бага?

Вот попробуй это, у меня работает.

Код:
#Region  ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_File_Add=gbl_ml_a0_h.frm, RCDATA, frames_a0_h
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#Include <WinAPIEx.au3>

_ResSaveToFile('C:\frames_a0_h.frm', 'frames_a0_h')

Func _ResSaveToFile($sFile, $iRes, $iType = 'RCDATA')

    Local $hFile, $hInst, $hInfo, $hData, $pData, $tData, $iSize, $iByte

    $hInst = _WinAPI_GetModuleHandle('')
    $hInfo = _WinAPI_FindResource($hInst, $iRes, $iType)
    $hData = _WinAPI_LoadResource($hInst, $hInfo)
    $iSize = _WinAPI_SizeofResource($hInst, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    $tData = DllStructCreate('byte[' & $iSize & ']', $pData)
    $hFile = _WinAPI_CreateFile($sFile, 1)
    If Not $hFile Then
        Return SetError(2, 0, 0)
    EndIf
    _WinAPI_WriteFile($hFile, DllStructGetPtr($tData), $iSize, $iByte)
    _WinAPI_CloseHandle($hFile)
    If $iByte <> $iSize Then
        Return SetError(3, 0, 0)
    EndIf
    Return 1
EndFunc   ;==>_ResSaveToFile


VitAl2013 [?]
Может это както быть связаным с тем что у меня 64битый Xeon?

Может.
 
Автор
V

VitAl2013

Гость
Ёлы палы... а у меня не работает. Если положить файл frm рядом со скриптом, то не впитывает, на всех режимах. Если прописать путь, то впитывает, но не раскрывает, опять же на всех режимах.

Все режимы это:
1) Обычный (неGUIвый) AutoIt3Wrapper без #AutoIt3Wrapper_UseX64=y + aut2exe.exe
2) Обычный (неGUIвый) AutoIt3Wrapper без #AutoIt3Wrapper_UseX64=y + Aut2exe_x64.exe
3) Обычный (неGUIвый) AutoIt3Wrapper с #AutoIt3Wrapper_UseX64=y + aut2exe.exe
4) Обычный (неGUIвый) AutoIt3Wrapper с #AutoIt3Wrapper_UseX64=y + Aut2exe_x64.exe
5) - 8) тоже самое но с GUI
9) - 18) тоже самое что выше но с вырубленым #AutoIt3Wrapper_UseX64=n

Чтоже делать, какже быть... :reading_book: :search: :Google: :sweating: :scratch:

Сходил надыбал 32битный кар. Компилировал на нём, тоже самое... Может ли это быть связано с каким-нить антивирусом типа McAfee? Есть ли способ проверить?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
VitAl2013
Всё таки попробуй добится с ResHacker.exe, вот пример. Попробуй выполнить добавления ресурса в самой программе ResHacker.exe. Если она добавить сможет, то 64 бита тут не причём, останется проблема с путями.
 
Автор
V

VitAl2013

Гость
Хорошо, я попробую добиться от РесХака чегонить.
Прошу протестить файл, может он у других писать то будет. И Если будет возможность то скомпилировать у себя и посмотреть работает ли он в принцыпе.
Вот код:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Version=Beta
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_File_Add=Z:\HOME\Programs\Programming\AutoIT\pole_for_test\include\formats\gbl_ml_a0_h.frm, RCDATA, frames_a0_h
#AutoIt3Wrapper_outfile=Z:\HOME\Programs\Programming\AutoIT\pole_for_test\ResSave_test.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;#include <resources.au3>
#Include <WinAPIEx.au3>
Local $way = "C:\temp\MLS_temp"
Local $list_format = "A0"
Local $position = "horizontal"
Local $where = $way&"\formats\gbl_ml_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))&".frm"
Local $what = "FRAMES_"&StringUpper($list_format)&"_"&StringUpper(StringLeft($position, 1))

MsgBox (64, "$where/what", "$where = "&$where&@CRLF&"$what = "&$what)

_ResSaveToFile($where, $what)
If @error <> 0 Then
   MsgBox (64, "error", "@error = "& @error)
EndIf

Func _ResSaveToFile($sFile, $iRes)

    Local $hFile, $hInst, $hInfo, $hData, $pData, $tData, $iSize, $iByte

    $hInst = _WinAPI_GetModuleHandle('')
    $hInfo = _WinAPI_FindResource($hInst, $iRes, $RT_RCDATA)
    $hData = _WinAPI_LoadResource($hInst, $hInfo)
    $iSize = _WinAPI_SizeofResource($hInst, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    $tData = DllStructCreate('byte[' & $iSize & ']', $pData)
    $hFile = _WinAPI_CreateFile($sFile, 1)
    If Not $hFile Then
        Return SetError(2, 0, 0)
    EndIf
    _WinAPI_WriteFile($hFile, DllStructGetPtr($tData), $iSize, $iByte)
    _WinAPI_CloseHandle($hFile)
    If $iByte <> $iSize Then
        Return SetError(3, 0, 0)
    EndIf
    Return 1
EndFunc   ;==>_ResSaveToFile


http://www.wikifortio.com/849650/ResSave_test.zip - это то что у меня скомпилировалось и что не работает.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
VitAl2013
Если в 32-битной не работает, то проблема точно с путями, ResHacker.exe используется в трансформэйшен-паках с версии 5 по 9, для патча разношёрстных ресурсов WindowsXP на протяжении нескольких лет.
И заметь, тот вариант что я выложил не требует особых манипуляций с ResHacker.exe, достаточно его положить как допонительную утилиту и во всех скрипта использовать для патча.

Если не получается, смотри ResHacker.log
 
Автор
V

VitAl2013

Гость
Не получается через reshacker... Мы говорим об одном и том же ResHacker - http://www.angusj.com/resourcehacker/ ?

Также не получается открыть через него ни один скомпилированный exe. Только через restorator или XN Resource Editor.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
VitAl2013
VitAl2013 сказал(а):
Также не получается открыть через него ни один скомпилированный exe.
Почему у меня получается? Что я делаю не так?

 
Автор
V

VitAl2013

Гость
Есть ли способ ещё както добавиь ресурсы? Нпример я встретил тут http://www.autoitscript.com/forum/index.php?showtopic=62776&view=findpost&p=471687 употребление _UpdateResources функции, но пока не углублялся.

Также попоробовал внедрить ресурс через XNRE (выше был) получил не работчий exe. Ругается красным.

Ещё нашёл http://www.ntcore.com/exsuite.php вот такую вот мега утилиту и что-то тут: http://www.ntcore.com/restweaker.php для неё (там ресхак и dll под разного рода процессоры). Качаю, буду щупать.

Ну видит она примерно тоже самое. Без Ресхака ресы есть, опятьже не ясно по каким оно там правилом сохраняется. С ресХаком - нет. Но если черех XN RE добавить новые rc data ресурсы, то всё выглядит по другому.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
VitAl2013
Есть ещё "PE Explorer", но я бы посоветовал поставить вторую систему инструментом в виде 32-битной WinPE и попробовать в ней.
 
Автор
V

VitAl2013

Гость
ВОт скрины в продолжение, а то только 5 можно. Из них какраз видно то о чём я говорил. Выше я выкладывал ссылку на exe, там правильно rcdata впаяна или нет?
 
Автор
V

VitAl2013

Гость
Yashied [?]
#AutoIt3Wrapper_Res_File_Add=Z:\HOME\...\gbl_ml_a0_h.frm, RCDATA, FRAMES
И всё таки RT_RCDATA :geek: тоесть скажем так, на windows 7 c 32bit процессором оно компилируется и работает именно с таким вот разворотом событий. На 64битном Xeon ешё не проверял.
 
Верх