Автор Тема: Выгрузить файл  (Прочитано 943 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Xabib2302 [?]

  • Новичок
  • *
  • Сообщений: 18
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Выгрузить файл
« Создано: Декабрь 27, 2016, 09:49:22 »
Доброе время суток. Возможно ли выгрузить файл без завершения процесса?
« Последнее редактирование: Декабрь 27, 2016, 09:54:41 от Xabib2302 »

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

Выгрузить файл
« Отправлен: Декабрь 27, 2016, 09:49:22 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2343
  • Репутация: 405
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #1, Отправлен: Декабрь 27, 2016, 10:22:37 »
что значит "выгрузить"?
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн Xabib2302 [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #2, Отправлен: Декабрь 27, 2016, 10:29:04 »
что значит "выгрузить"?
есть например dll для контекстного меню. и для ее полного удаления требуется завершить процесс explorer

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3061
  • Репутация: 814
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Выгрузить файл
« Ответ #3, Отправлен: Декабрь 27, 2016, 12:03:32 »
Xabib2302
Цитировать
есть например dll для контекстного меню
https://www.autoitscript.com/forum/topic/139347-autoit-unlocker/
Во всяком случае 7-zip.dll выгружает (Win7 x86). Правда, проводник после этого крашится при вызове контекстного меню... Но вам ведь интересна сама возможность? ;)

Цитировать
требуется завершить процесс explorer
И в чём проблема? Завершили, удалили, запустили. Скрипт в три строчки.

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

Re: Выгрузить файл
« Ответ #3 Отправлен: Декабрь 27, 2016, 12:03:32 »

Оффлайн Xabib2302 [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #4, Отправлен: Январь 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


Можно обойтись и одним скриптом т.е. прописать завершение процесса и удаление этого файла,но путь установки (распаковки) программы может меняться.
Тем более второй скрипт не запускает проводник. Он открывает только папку Библиотека, а панель задач, рабочий стол и т.д. и т.п не появляются
« Последнее редактирование: Январь 08, 2017, 10:02:55 от Xabib2302 »

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3061
  • Репутация: 814
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Выгрузить файл
« Ответ #5, Отправлен: Январь 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.
« Последнее редактирование: Январь 09, 2017, 16:01:30 от InnI »

Оффлайн Xabib2302 [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #6, Отправлен: Январь 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
 


Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3573
  • Репутация: 923
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #7, Отправлен: Январь 10, 2017, 08:14:48 »
Xabib2302

ПредупреждениеЗа нарушение общих правил (пункт В.2):
Цитировать
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.

Скорблю и помню.




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

Re: Выгрузить файл
« Ответ #7 Отправлен: Январь 10, 2017, 08:14:48 »

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3061
  • Репутация: 814
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Выгрузить файл
« Ответ #8, Отправлен: Январь 10, 2017, 11:40:41 »
Xabib2302  [?]
Цитировать
не выгружает почему-то
InnI
Цитировать
выгружать их надо через AutoIt3_x64.exe

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

В противном случае запускайте скрипт через всплывающее меню au3-файла "Run Script (x64)". Либо компилируйте скрипт под x64 и запускайте полученный EXE.

Оффлайн Xabib2302 [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #9, Отправлен: Январь 10, 2017, 12:27:22 »
У меня lite версия SciTE. Run Script (x64) тоже пробовал. Dll все-равно весит в контекстном меню и в процессе explorer. UnlockerCOM.dll выгружает


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Январь 10, 2017, 12:34:08 от Xabib2302 »

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3061
  • Репутация: 814
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Выгрузить файл
« Ответ #10, Отправлен: Январь 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 подгружается при первом вызове меню в тот процесс, в окне которого вы работаете.

Оффлайн Xabib2302 [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #11, Отправлен: Январь 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 перезапускается в виде ошибки. "Прекращение работы Проводник"
« Последнее редактирование: Январь 10, 2017, 21:26:17 от Xabib2302, Причина: Объединение сообщений »

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3061
  • Репутация: 814
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Выгрузить файл
« Ответ #12, Отправлен: Январь 11, 2017, 13:53:02 »
Xabib2302
Цитировать
появилась другая проблема
Это не проблема - это особенность выгрузки dll. Я вас предупреждал об этом два раза.

Оффлайн Xabib2302 [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Выгрузить файл
« Ответ #13, Отправлен: Январь 13, 2017, 20:45:58 »
InnI, можно ли дописать в скрипт вторую dll?

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3061
  • Репутация: 814
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Выгрузить файл
« Ответ #14, Отправлен: Январь 13, 2017, 22:06:53 »
Xabib2302
Цитировать
можно ли дописать в скрипт вторую dll?
Странный вопрос для человека, которому
Цитировать
не проблема написать скрипт
Или вы у меня спрашиваете разрешение на изменение кода скрипта? :)

Конечно, можно! Вопрос в другом: "А нужно ли?" Если бы выгрузка dll была безопасной операцией, то любой установщик делал бы это самостоятельно и не предлагал бы перезагрузку или перелогин. Я очень не рекомендую заниматься этим кроме как в "академических" целях.
« Последнее редактирование: Январь 13, 2017, 22:18:49 от InnI »

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

Re: Выгрузить файл
« Ответ #14 Отправлен: Январь 13, 2017, 22:06:53 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
14 Ответов
6982 Просмотров
Последний ответ Апрель 13, 2010, 02:55:08
от CreatoR
6 Ответов
5469 Просмотров
Последний ответ Январь 25, 2011, 03:25:05
от Pavel
3 Ответов
2305 Просмотров
Последний ответ Май 04, 2013, 23:22:21
от AZJIO
2 Ответов
1685 Просмотров
Последний ответ Июнь 12, 2013, 22:58:17
от Vovsla
1 Ответов
1824 Просмотров
Последний ответ Август 12, 2013, 11:27:11
от XpycT
2 Ответов
1982 Просмотров
Последний ответ Сентябрь 23, 2013, 14:42:39
от urrya
3 Ответов
1531 Просмотров
Последний ответ Ноябрь 24, 2013, 09:08:40
от madmasles
6 Ответов
3467 Просмотров
Последний ответ Апрель 13, 2014, 12:33:18
от Garrett
0 Ответов
449 Просмотров
Последний ответ Август 01, 2014, 21:21:34
от madmasles
3 Ответов
874 Просмотров
Последний ответ Март 17, 2015, 11:36:47
от joiner