Русское сообщество AutoIt

Общий раздел по AutoIt => Общие вопросы по AutoIt => Тема начата: Xabib2302 от Декабрь 27, 2016, 09:49:22

Название: Выгрузить файл
Отправлено: Xabib2302 от Декабрь 27, 2016, 09:49:22
Доброе время суток. Возможно ли выгрузить файл без завершения процесса?
Название: Re: Выгрузить файл
Отправлено: joiner от Декабрь 27, 2016, 10:22:37
что значит "выгрузить"?
Название: Re: Выгрузить файл
Отправлено: Xabib2302 от Декабрь 27, 2016, 10:29:04
что значит "выгрузить"?
есть например dll для контекстного меню. и для ее полного удаления требуется завершить процесс explorer
Название: Re: Выгрузить файл
Отправлено: InnI от Декабрь 27, 2016, 12:03:32
Xabib2302
Цитировать
есть например dll для контекстного меню
https://www.autoitscript.com/forum/topic/139347-autoit-unlocker/
Во всяком случае 7-zip.dll выгружает (Win7 x86). Правда, проводник после этого крашится при вызове контекстного меню... Но вам ведь интересна сама возможность? ;)

Цитировать
требуется завершить процесс explorer
И в чём проблема? Завершили, удалили, запустили. Скрипт в три строчки.
Название: Re: Выгрузить файл
Отправлено: Xabib2302 от Январь 08, 2017, 09:51:53
Цитировать
И в чём проблема? Завершили, удалили, запустили. Скрипт в три строчки.
Мне не проблема написать скрипт, но я не знаю за какое время инсталлятор заменит этот файл. Поэтому я сделал 2 скрипта 1 из которых запускается в начале, а другой в конце установки.
Код: AutoIt [Выделить]
While ProcessClose("explorer.exe")
  Sleep(100)
WEnd


Код: AutoIt [Выделить]
If ProcessExists("Script.exe") Then ; запущен ли первый скрипт
   ProcessClose("Script.exe")
EndIf
If not ProcessExists("explorer.exe") Then
   Run("explorer.exe", "")
EndIf


Можно обойтись и одним скриптом т.е. прописать завершение процесса и удаление этого файла,но путь установки (распаковки) программы может меняться.
Тем более второй скрипт не запускает проводник. Он открывает только папку Библиотека, а панель задач, рабочий стол и т.д. и т.п не появляются
Название: Re: Выгрузить файл
Отправлено: InnI от Январь 09, 2017, 14:29:48
Xabib2302
Цитировать
не знаю за какое время инсталлятор заменит этот файл
Следите за размером и/или датой файла.

Цитировать
путь установки (распаковки) программы может меняться
Путь можно сохранить в реестре.

Цитировать
открывает только папку Библиотека
На x64 системах нужно запускать скрипт через AutoIt3_x64.exe.



Выгрузить dll из процесса можно так
Код: AutoIt [Выделить]
; #AutoIt3Wrapper_UseX64 = Y

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIProc.au3>
#include <ProcessConstants.au3>

$ProcName = "explorer.exe"
$DllName = "7-zip.dll"

$PID = ProcessExists($ProcName)
$aData = _WinAPI_EnumProcessModules($PID)
If @error Then Exit

For $i = 1 To $aData[0][0]
  If StringInStr($aData[$i][1], $DllName) Then
    $hKernel32 = DllOpen("kernel32.dll")
    $Access = BitOR($PROCESS_CREATE_THREAD, $PROCESS_QUERY_INFORMATION, $PROCESS_VM_OPERATION, $PROCESS_VM_WRITE, $PROCESS_VM_READ)
    $pHandle = _WinAPI_OpenProcess($Access, 0, $PID)
    $hModule = _WinAPI_GetModuleHandle("kernel32.dll")
    $FreeLibrary = _WinAPI_GetProcAddress($hModule, "FreeLibrary")
    $hThread = DllCall($hKernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $FreeLibrary, "long", $aData[$i][0], "int", 0, "int", 0)
    _WinAPI_WaitForSingleObject($hThread[0])
    _WinAPI_CloseHandle($hThread[0])
    _WinAPI_CloseHandle($hModule)
    _WinAPI_CloseHandle($pHandle)
    DllClose($hKernel32)
    ExitLoop
  EndIf
Next

Проблема в том, что процесс при обращении к этой dll аварийно завершит работу. Так, например, происходит с проводником на Win7x86 при вызове контекстного меню после выгрузки 7-zip.dll. А вот на Win10x64 проводник автоматически перезапускается. И соблюдайте разрядность системы: процессы x64 загружают соответствующие dll и выгружать их надо через AutoIt3_x64.exe.
Название: Re: Выгрузить файл
Отправлено: Xabib2302 от Январь 10, 2017, 00:09:56
Xabib2302
Цитировать
не знаю за какое время инсталлятор заменит этот файл
Следите за размером и/или датой файла.

Цитировать
путь установки (распаковки) программы может меняться
Путь можно сохранить в реестре.

Цитировать
открывает только папку Библиотека
На x64 системах нужно запускать скрипт через AutoIt3_x64.exe.



Выгрузить dll из процесса можно так
Код: AutoIt [Выделить]
; #AutoIt3Wrapper_UseX64 = Y

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIProc.au3>
#include <ProcessConstants.au3>

$ProcName = "explorer.exe"
$DllName = "7-zip.dll"

$PID = ProcessExists($ProcName)
$aData = _WinAPI_EnumProcessModules($PID)
If @error Then Exit

For $i = 1 To $aData[0][0]
  If StringInStr($aData[$i][1], $DllName) Then
    $hKernel32 = DllOpen("kernel32.dll")
    $Access = BitOR($PROCESS_CREATE_THREAD, $PROCESS_QUERY_INFORMATION, $PROCESS_VM_OPERATION, $PROCESS_VM_WRITE, $PROCESS_VM_READ)
    $pHandle = _WinAPI_OpenProcess($Access, 0, $PID)
    $hModule = _WinAPI_GetModuleHandle("kernel32.dll")
    $FreeLibrary = _WinAPI_GetProcAddress($hModule, "FreeLibrary")
    $hThread = DllCall($hKernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $FreeLibrary, "long", $aData[$i][0], "int", 0, "int", 0)
    _WinAPI_WaitForSingleObject($hThread[0])
    _WinAPI_CloseHandle($hThread[0])
    _WinAPI_CloseHandle($hModule)
    _WinAPI_CloseHandle($pHandle)
    DllClose($hKernel32)
    ExitLoop
  EndIf
Next

Проблема в том, что процесс при обращении к этой dll аварийно завершит работу. Так, например, происходит с проводником на Win7x86 при вызове контекстного меню после выгрузки 7-zip.dll. А вот на Win10x64 проводник автоматически перезапускается. И соблюдайте разрядность системы: процессы x64 загружают соответствующие dll и выгружать их надо через AutoIt3_x64.exe.
не выгружает почему-то
Код: AutoIt [Выделить]
; #AutoIt3Wrapper_UseX64 = Y

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIProc.au3>
#include <ProcessConstants.au3>

$ProcName = "explorer.exe"
$DllName = "aimp_menu64.dll"

$PID = ProcessExists($ProcName)
$aData = _WinAPI_EnumProcessModules($PID)
If @error Then Exit

For $i = 1 To $aData[0][0]
  If StringInStr($aData[$i][1], $DllName) Then
    $hKernel32 = DllOpen("kernel32.dll")
    $Access = BitOR($PROCESS_CREATE_THREAD, $PROCESS_QUERY_INFORMATION, $PROCESS_VM_OPERATION, $PROCESS_VM_WRITE, $PROCESS_VM_READ)
    $pHandle = _WinAPI_OpenProcess($Access, 0, $PID)
    $hModule = _WinAPI_GetModuleHandle("kernel32.dll")
    $FreeLibrary = _WinAPI_GetProcAddress($hModule, "FreeLibrary")
    $hThread = DllCall($hKernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $FreeLibrary, "long", $aData[$i][0], "int", 0, "int", 0)
    _WinAPI_WaitForSingleObject($hThread[0])
    _WinAPI_CloseHandle($hThread[0])
    _WinAPI_CloseHandle($hModule)
    _WinAPI_CloseHandle($pHandle)
    DllClose($hKernel32)
    ExitLoop
  EndIf
Next
 

Название: Re: Выгрузить файл
Отправлено: Garrett от Январь 10, 2017, 08:14:48
Xabib2302

ПредупреждениеЗа нарушение общих правил (пункт В.2 (http://autoit-script.ru/index.php?action=rules#c.2)):
Цитировать
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
Название: Re: Выгрузить файл
Отправлено: InnI от Январь 10, 2017, 11:40:41
Xabib2302  [?]
Цитировать
не выгружает почему-то
InnI
Цитировать
выгружать их надо через AutoIt3_x64.exe

Если у вас полная версия SciTE и вы запускаете скрипт из неё, то раскомментируйте первую строку
Код: AutoIt [Выделить]
#AutoIt3Wrapper_UseX64 = Y

В противном случае запускайте скрипт через всплывающее меню au3-файла "Run Script (x64)". Либо компилируйте скрипт под x64 и запускайте полученный EXE.
Название: Re: Выгрузить файл
Отправлено: Xabib2302 от Январь 10, 2017, 12:27:22
У меня lite версия SciTE. Run Script (x64) тоже пробовал. Dll все-равно весит в контекстном меню и в процессе explorer. UnlockerCOM.dll выгружает
Название: Re: Выгрузить файл
Отправлено: InnI от Январь 10, 2017, 12:52:10
Xabib2302
Я проверил на Win10x64 - aimp_menu64.dll из проводника выгружается. Т.е. до запуска скрипта Process Explorer её находит, после работы скрипта - нет.

Вы когда скрипт запускаете - у вас сколько процессов explorer.exe? Должен быть только один, т.к. скрипт обрабатывает первый найденный.

Проверьте так. Положите mp3-файл на рабочий стол, закройте все процессы explorer.exe, кроме рабочего стола, вызовите на mp3-файле контекстное меню. Теперь поищите dll в Process Explorer - он её найдёт. Запустите скрипт. Повторите поиск - Process Explorer не должен найти dll. Другими словами, dll подгружается при первом вызове меню в тот процесс, в окне которого вы работаете.
Название: Re: Выгрузить файл
Отправлено: Xabib2302 от Январь 10, 2017, 13:58:15
Проверьте так. Положите mp3-файл на рабочий стол, закройте все процессы explorer.exe, кроме рабочего стола, вызовите на mp3-файле контекстное меню. Теперь поищите dll в Process Explorer - он её найдёт. Запустите скрипт. Повторите поиск - Process Explorer не должен найти dll. Другими словами, dll подгружается при первом вызове меню в тот процесс, в окне которого вы работаете.
да. работает. я просто после работы скрипта сразу заходил в контекстное меню чтобы нажать "расположение файла" и поэтому не удавалось удалить или заменить dll


Добавлено: Январь 10, 2017, 21:26:17
Но появилась другая проблема. На Win 7 x86 explorer перезапускается в виде ошибки. "Прекращение работы Проводник"
Название: Re: Выгрузить файл
Отправлено: InnI от Январь 11, 2017, 13:53:02
Xabib2302
Цитировать
появилась другая проблема
Это не проблема - это особенность выгрузки dll. Я вас предупреждал об этом два раза.
Название: Re: Выгрузить файл
Отправлено: Xabib2302 от Январь 13, 2017, 20:45:58
InnI, можно ли дописать в скрипт вторую dll?
Название: Re: Выгрузить файл
Отправлено: InnI от Январь 13, 2017, 22:06:53
Xabib2302
Цитировать
можно ли дописать в скрипт вторую dll?
Странный вопрос для человека, которому
Цитировать
не проблема написать скрипт
Или вы у меня спрашиваете разрешение на изменение кода скрипта? :)

Конечно, можно! Вопрос в другом: "А нужно ли?" Если бы выгрузка dll была безопасной операцией, то любой установщик делал бы это самостоятельно и не предлагал бы перезагрузку или перелогин. Я очень не рекомендую заниматься этим кроме как в "академических" целях.
Название: Re: Выгрузить файл
Отправлено: Alofa от Январь 14, 2017, 01:03:32
На Win 7 x86 explorer перезапускается в виде ошибки...
И я вам больше скажу: при этом, к примеру, UAC (https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C_%D1%83%D1%87%D1%91%D1%82%D0%BD%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9) напрочь перестает выполнять свои функции (перезапуск же будет от вашего администраторского имени) и бог его знает какие еще службы могут пострадать.
А что вы будете делать когда процессов "explorer.exe" будет несколько (вошли несколько пользователей)?

Я очень не рекомендую заниматься этим...


Добавлено: Январь 14, 2017, 01:12:56
Зато могу посоветовать пойти другим путем (http://autoit-script.ru/index.php?topic=4304.msg31078#msg31078). Оставляете в покое .DLL до ближайшего выключения/перезагрузки ПК и удаляете ее, а после и сам скрипт (http://autoit-script.ru/index.php?topic=325.0).
Название: Re: Выгрузить файл
Отправлено: InnI от Январь 14, 2017, 13:15:44
Обновление динамически подключаемой библиотеки (DLL) (http://www.vsokovikov.narod.ru/New_MSDN_API/DLL/dll_update.htm)