Что нового

Данные, строки О вытаскивании файлов из пользовательских ресурсов и помещении их в нужное место

Twilight_Wolf

Новичок
Сообщения
16
Репутация
0
Доброго дня, уважаемы эксперты!

Подскажите, пожалуйста, как вытянуть из скомпилированного скрипта заложенный туда пользовательский ресурс (файл) и поместить его в определенную пользовательскую папку при запуске скрипта? С помещением ресурса в тело скрипта проблем нет - AutoIt3Wrapper рулит, а вот как произвести обратное действие?
Зачем это надо: требуется автоматизировать настройку рабочих станций удалённых пользователей и для этого требуется поместить ряд файлов в нужные папки (рабочий стол, профиль и т. д.). Хочется сделать всё красиво - упаковать все ресурсные файлы в один exe, чтобы пользователям максимально облегчить задачу, свести действия к минимуму и ничего в процессе пересылки не потерялось.
Упаковываю файлы и получаю переменные среды так:
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=rdp.ico
#AutoIt3Wrapper_Res_File_Add=rasphone.pbk, files, 200
#AutoIt3Wrapper_Res_File_Add=RDP.rdp, files, 201
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
AutoItSetOption('ExpandEnvStrings',1)
EnvSet('UserAppDataDir','%APPDATA%')
EnvSet('UserDesktopDir',@DesktopDir)


Как теперь, к примеру, файл RDP.rdp поместить на рабочий стол? Заранее прошу прощения, если вопрос можно классифицировать как глупый)))
Сообщение автоматически объединено:

Смысл в том, чтобы упаковывать ресурсы на компьютере администратора, специально созданные под конкретного пользователя (имена файлов всегда одинаковые, но содержимое разное), затем передавать этот скомпилированный скрипт пользователю, которому достаточно дважды кликнуть по файлу и получить настроенную рабочую станцию с разложенными по местам файлами. Эту задачу можно решить разными способами. например через bat или самораспаковывающийся архив. но хотелось бы понять, как работать с ресурсами в Autoit (от части на будущее).
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
упаковывать ресурсы на компьютере администратора

хотелось бы понять, как работать с ресурсами в Autoit
 
Автор
T

Twilight_Wolf

Новичок
Сообщения
16
Репутация
0
Благодарю за наводку. Вторую ссылку я видел, но видимо не до конца прочитал - там в основном описывают типы ресурсов и как их использовать в программе, что тоже очень полезно.
Сообщение автоматически объединено:

К сожалению, скрипты из примера по второй ссылке недоступны, но отдельные подсказки там всё же есть. Пошёл повторно читать FAQ. Всё равно большое спасибо, что уделили мне внимание :hi:
 
Последнее редактирование:
Автор
T

Twilight_Wolf

Новичок
Сообщения
16
Репутация
0
Огромное спасибо! Очень много нового узнал и переделал пример под собственные нужды - всё работает прекрасно! Только пока никак не могу сообразить, как к добавленной мною третьей кнопке к первому примеру привязать событие очистки всех ресурсов и пересохранения скомпилированного файла? При нажатии второй кнопки скрипт как раз сначала удаляет все ресурсы, а затем засовывает новые. Требуется убрать из кода второй кнопки всё лишнее, чтобы осталась только функция очистки, которую перенесу в третью кнопку.

Код:
Case $idButton_2 ; Загружаем Новые Данные в Исполняемый модуль
            $aDirSize = DirGetSize($sDataPath, 1)
            If (Not @error) And ($aDirSize[1] + $aDirSize[2]) Then
                GUICtrlSetState($idButton_1, $GUI_DISABLE)
                GUICtrlSetState($idButton_2, $GUI_DISABLE)
                GUISetCursor(15, 1)

                If FileMove(@ScriptFullPath, $sPathRenamedFile, 1) Then ; Переименовываем исполняемый модуль
                    ; FileSetAttrib($sPathRenamedFile, '+HT') ; Скрыть файл
                    If Not FileCopy($sPathRenamedFile, @ScriptFullPath, 1) Then ExitLoop SetError(3) ; Копируем файл
                Else
                    ExitLoop SetError(4)
                EndIf

                $hModule = _WinAPI_BeginUpdateResource(@ScriptFullPath)
                If @error Then ExitLoop SetError(5)

                $aFileList = _FileListToArrayRec($sDataPath, Default, $FLTAR_FILESFOLDERS, $FLTAR_RECUR, $FLTAR_NOSORT)
                If @error Then ExitLoop SetError(6)

                If IsArray($aResNames) Then
                    _DeleteResourcesType($hModule, $sResType, $aResNames) ; Удаляем из модуля все ресурсы данного типа
                    If @error Then ExitLoop SetError(7)
                EndIf
                GUISetState(@SW_HIDE)

                ProgressOn('', 'Загрузка новых ресурсов:', '', -1, -1, $DLG_MOVEABLE)
                For $i = 1 To $aFileList[0] ; Загружаем в модуль файлы с сохранением структуры папок
                    If Not _LoadingResourceFromDirTree($hModule, $sResType, $sDataDir & '\' & $aFileList[$i]) Then ExitLoop SetError(8)
                    ProgressSet(($i * 100 / $aFileList[0]), 'Файл ' & $i & ' из ' & $aFileList[0])
                Next

                If Not _WinAPI_EndUpdateResource($hModule) Then
                    MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, 'Ошибка сохранения:' & @LF & _
                            '_WinAPI_GetLastError() = ' & _WinAPI_GetLastError() & ' (' & _WinAPI_GetLastErrorMessage() & ')')
                    ExitLoop SetError(0)
                EndIf

                If GUICtrlRead($idCheckbox) = $GUI_CHECKED Then
                    If Not DirRemove($sDataPath, 1) Then ExitLoop SetError(9)
                EndIf
                ExitLoop
            Else
                MsgBox($MB_TOPMOST + $MB_ICONINFORMATION, Default, 'Сначала создайте НЕпустую папку "' & $sDataDir & '" для сохранения ее содержимого.', 0, $hGUI)
            EndIf


Видимо я до конца не понимаю, как очищается перепаковывается файл и удаляю всё время что-то лишнее, потому ресурсы не удаляются. Если не составит большого труда, подскажите, на что обратить внимание. Заранее большое спасибо!
Сообщение автоматически объединено:

Вроде бы вот оно:
Код:
$hModule = _WinAPI_BeginUpdateResource(@ScriptFullPath)
                _DeleteResourcesType($hModule, $sResType, $aResNames) ; Удаляем из модуля все ресурсы данного типа
               If Not _WinAPI_EndUpdateResource($hModule) Then
                    MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, 'Ошибка сохранения:' & @LF & _
                            '_WinAPI_GetLastError() = ' & _WinAPI_GetLastError() & ' (' & _WinAPI_GetLastErrorMessage() & ')')
                    ExitLoop SetError(0)
                EndIf

Но если оставить только эти строчки в коде третьей кнопки, то ресурсы не удаляются...
 
Последнее редактирование:

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Но если оставить только эти строчки в коде третьей кнопки, то ресурсы не удаляются...
Логично, как программа может изменить сама себя (свой исполняемый файл) в состоянии работы?
Поэтому в коде перед вызовом _DeleteResourcesType() производятся еще кое какие действия. Почитайте комментарии посмотрите в справке описание функций.
P.s: и все вопросы по коду из той или иной темы задавайте в тех же темах.
 
Последнее редактирование:
Автор
T

Twilight_Wolf

Новичок
Сообщения
16
Репутация
0
Утро вечера мудреннее) Всё понял) Премного благодарен:hi:
 
Верх