Как узнать handle dll

Обновлено: 05.07.2024

Загрузка. Пожалуйста,
подождите.

Репутация: нет
Всего: 7

Привет всем!
Появилась небольшая задачка, пусть исполняется функция в некоторой ДЛЛ. В этой функции надо получить хэндл ДЛЛ, в которой выполняется эта функция. Примерно так.
Терпимость - величайшее благо человечества.
Ярчайший признак интеллекта – постоянно хорошее настроение…

Репутация: 7
Всего: 146

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

Репутация: нет
Всего: 7

Тут просто вызов довольно-таки специфический. Он через JNI происходит.

Терпимость - величайшее благо человечества.
Ярчайший признак интеллекта – постоянно хорошее настроение…

Репутация: 7
Всего: 146

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

Репутация: нет
Всего: 7

Ну вобщем, JNI - это вызов ДЛЛ-функции, написанной на С/С++, из приложения, написанного на Джава. Проблема в том, что мне надо в ДЛЛ установить глобальные хуки, а сами фунции-обработчики хуков тоже должны находится в ДЛЛ. Получается какой-то замкнутый круг. А очень желательно, чтобы установка хуков и их обработчики лежали в одной ДЛЛ.

Терпимость - величайшее благо человечества.
Ярчайший признак интеллекта – постоянно хорошее настроение…

Репутация: нет
Всего: 7

Всем спасибо, тему можно закрывать, действительно, можно хэндл через DllMain получить.
Терпимость - величайшее благо человечества.
Ярчайший признак интеллекта – постоянно хорошее настроение…

Репутация: нет
Всего: нет

Репутация: 13
Всего: 98

supersonic, ты думаеш что автора по прошествии восьми месяцев продолжает мачить этот вопрос? ;) (я уже не говорю про галку "вопрос решен")

Репутация: нет
Всего: нет

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

[ Время генерации скрипта: 0.1142 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Как я могу узнать, какой процесс блокирует файл или папку в Windows? Например, при попытке удалить папку Windows сообщает следующее:

Операция не может быть завершена, так как эти папка или файл открыты в другой программе. Закройте папку или файл и повторите попытку.


Такая же ошибка может возникнуть при переименовании или удаления как папки, так и файла. Но как узнать, какая программа или приложение в настоящее время использует его и не позволяет удалить файл или папку?

Имеется сразу несколько способов и программ чтобы найти процессы и программы, которые открыли файл.

1. Монитор ресурсов

Для поиска программы или процесса, открывшей файл, вы можете использовать Монитор ресурсов (Resource Monitor), который встроен в Windows 7, 8 и 10.

Откройте Монитор ресурсов, это можно сделать несколькими способами:

  • В поле для поиска введите «Монитор ресурсов» или resmon.exe:


  • Или в Диспетчере задач перейдите на вкладку «Производительность» и найдите кнопку «Открыть монитор ресурсов»:


В Мониторе ресурсов перейдите на вкладку ЦП (CPU). Используйте поле поиска в разделе «Связанные дескрипторы»


В результатах поиска в столбце «Образ» вы увидите, какая программа запустила процесс, блокирующий файл.

Здесь же вы можете кликнуть правой кнопкой мыши по любому найденному процессу и нажать «Завершить процесс», чтобы закрыть программу, блокирующую файл.


2. Process Explorer

Перейдите в Find → Handle or DLL.


В текстовом поле "Handle or DLL substring:" введите путь до файла или папки. Будут показаны все процессы, которые имеют открытый обработчик на этот файл.

3. OpenedFilesView

OpenedFilesView это бесплатная программа не требующая установки, она покажет все открытые файлы, имеется возможность искать по имени или пути файла:


4. LockHunter

LockHunter — это надёжная программа для разблокировки файлов.


Это бесплатный инструмент для удаления файлов, заблокированных неизвестным процессом. LockHunter полезен для борьбы с вредоносными программами и другими программами, которые блокируют файлы без причины. В отличие от других подобных инструментов, он удаляет файлы в корзину, поэтому вы можете восстановить их, если удалили по ошибке.

'> Народ как узнать хендл главного окна процесса? , надо найти главное окно процесса по PID чтобы можно было этот процесс Требуется закрыть процесс для чего надо найти его главное окно а как найти по PID-у главное окно этого процесса чтоб можно было ему послать команду на закрытие?



EnumThreadWindows ? Правда, для этого потребуется уточнить, какому потоку принадлежит окно, все же. примерчик ее использования дай, и про поток я чет неочень представляю как его узнать пока меня однопоточные проги по подались



примерчик ее использования дай, и про поток я чет неочень представляю как его узнать пока меня однопоточные проги по подались

Ну вот, щас напишу пример специально.

Private Declare Function EnumThreadWindows Lib "user32.dll" (ByVal dwThreadId As Long, ByVal lpfn As Long, ByVal lParam As Long) As Long

dwThreadId - где взять индефикатор потока?
lpfn, lParam - че это за параметры?



Автор, наверное очень сложно скачать себе APIGuide(ссылка вверху страницы) и посмотреть пример? блин я таким же крабом через EnumWindows главное окно находил но касяк в том что у некоторых прог при одном процессе и одном потоке этих главных окон несколько но самое главное через которое прогу мона закрыть только одно и вопрос в том как найти это самое при главное окно



Может тебе EndTask подойдет? (декларацию и пример использования просить не надо, сразу в поиск) странно в API-Guide такова нет, в поиске тож негусто



по ней инфы мало
Private Declare Function PostThreadMessage Lib "user32.dll" Alias "PostThreadMessageA" (ByVal idThread As Long, ByVal msg As Long, ByVal wParam As Long, lParam As Any) As Long

wParam, lParam - это чего за два параметра?



Добавлено 19.08.07, 18:05
Хотя все равно, правильно вызывать EndTask и передавать ей в качестве hWnd хэндл окна. Первый попавшийся со стилем WS_POPUP, хотя точно не скажу

декларацию дай а то в инете чет не нашел, и почему окно должно быть WS_POPUP.

и очень сумневаюсь что любое окно подойдет если я правильно понял эта функция отправляет команду закрытия окна значит если окно не главное то эффект будет такой же как и от SendMessage это окно закроется а процесс незавершится



там только четыре страницы найдено и все на англицком кроме декларации больше нефега нема

Declare Function EndTask Lib "user32.dll" (ByVal hWnd As IntPtr) As Integer

IntPtr - блин и че это за тип переменной ?
мож кто нить напишет как EndTask пользоваться если хендл окна находится в глобальной переменной hwin

Добавлено 20.08.07, 05:56
в яхуу нашол другой вид декларации:
Declare Function EndTask Lib "user32" Alias "EndTask" (ByVal hwnd As Long, _
ByVal nShutDown as Long, ByVal nForce as Long, ) As Long

непонял какова фига там после nForce as Long делает запятая и непонятно че за параметры nShutDown и nForce но без запятой и с нулевыми значениями параметров(nShutDown и nForce) все работает как надо находиш любое окно и после выполнения EndTask программа выполняет штатный выход.

теперь подскажите как правильно декларация должна выглядеть и че кроме хендла за остальные параметры ?

Можно ли это сделать во время загрузки библиотеки, т.е. в функции dlopen()?




Дело в том, что мне нужно знать этот handler уже при инициализации иблиотеки, т.е. в функции _init().

Должно решаться через интерфейс ld.so.
Во фряхе есть /usr/include/link.h, не знаю, как он называтся в линуксе.



Дело не в этом. Дело в том, что делается некая программа, которая создает динамические библиотеки. Библиотеки специфичны, должны инициироваться каждая по-своему, и каждая из них при инициализации должна знать handle, которым потом будет оперировать и пользователь. Библиотеки-то могут использоваться сторониними пользователями.


> Дело не в этом. Дело в том, что делается некая программа, которая > создает динамические библиотеки. Библиотеки специфичны, должны > инициироваться каждая по-своему, и каждая из них при инициализации > должна знать handle, которым потом будет оперировать и > пользователь. Библиотеки-то могут использоваться сторониними > пользователями.

напиши либу типа openlib в которой будут твои функции load_file и unload_file которые будут использовать сторонние пользователи а прога будет генерить "правильные" либы чтобы они правильно работали с твоими load_file и unload_file. и будут эти либы инициироваться по своему .. у каждой свой _init - только разные libname или modulename.

Если все это не подходит то поспешу тебя огорчить .. .so это не .dll из so ты никогда не увидишь символы вызывающей стороны(в винде можно). С другой стороны вызывающая сторона видит как свои так и .soшные символы .. так что .so без работы вызывающей стороны никогда не узнает про тот handle который она держит.

Читайте также: