есть например dll для контекстного меню. и для ее полного удаления требуется завершить процесс explorerjoiner сказал(а):что значит "выгрузить"?
https://www.autoitscript.com/forum/topic/139347-autoit-unlocker/есть например dll для контекстного меню
И в чём проблема? Завершили, удалили, запустили. Скрипт в три строчки.требуется завершить процесс explorer
Мне не проблема написать скрипт, но я не знаю за какое время инсталлятор заменит этот файл. Поэтому я сделал 2 скрипта 1 из которых запускается в начале, а другой в конце установки.И в чём проблема? Завершили, удалили, запустили. Скрипт в три строчки.
While ProcessClose("explorer.exe")
Sleep(100)
WEnd
If ProcessExists("Script.exe") Then ; запущен ли первый скрипт
ProcessClose("Script.exe")
EndIf
If not ProcessExists("explorer.exe") Then
Run("explorer.exe", "")
EndIf
Следите за размером и/или датой файла.не знаю за какое время инсталлятор заменит этот файл
Путь можно сохранить в реестре.путь установки (распаковки) программы может меняться
На x64 системах нужно запускать скрипт через AutoIt3_x64.exe.открывает только папку Библиотека
; #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
не выгружает почему-тоInnI сказал(а):Xabib2302
Следите за размером и/или датой файла.не знаю за какое время инсталлятор заменит этот файл
Путь можно сохранить в реестре.путь установки (распаковки) программы может меняться
На x64 системах нужно запускать скрипт через AutoIt3_x64.exe.открывает только папку Библиотека
Выгрузить dll из процесса можно такПроблема в том, что процесс при обращении к этой dll аварийно завершит работу. Так, например, происходит с проводником на Win7x86 при вызове контекстного меню после выгрузки 7-zip.dll. А вот на Win10x64 проводник автоматически перезапускается. И соблюдайте разрядность системы: процессы x64 загружают соответствующие dll и выгружать их надо через AutoIt3_x64.exe.Код:; #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
; #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
InnIне выгружает почему-то
выгружать их надо через AutoIt3_x64.exe
#AutoIt3Wrapper_UseX64 = Y
да. работает. я просто после работы скрипта сразу заходил в контекстное меню чтобы нажать "расположение файла" и поэтому не удавалось удалить или заменить dllInnI сказал(а):Проверьте так. Положите mp3-файл на рабочий стол, закройте все процессы explorer.exe, кроме рабочего стола, вызовите на mp3-файле контекстное меню. Теперь поищите dll в Process Explorer - он её найдёт. Запустите скрипт. Повторите поиск - Process Explorer не должен найти dll. Другими словами, dll подгружается при первом вызове меню в тот процесс, в окне которого вы работаете.
Это не проблема - это особенность выгрузки dll. Я вас предупреждал об этом два раза.появилась другая проблема
Странный вопрос для человека, которомуможно ли дописать в скрипт вторую dll?
Или вы у меня спрашиваете разрешение на изменение кода скрипта?не проблема написать скрипт
И я вам больше скажу: при этом, к примеру, UAC напрочь перестает выполнять свои функции (перезапуск же будет от вашего администраторского имени) и бог его знает какие еще службы могут пострадать.Xabib2302 сказал(а):На Win 7 x86 explorer перезапускается в виде ошибки...
InnI сказал(а):Я очень не рекомендую заниматься этим...