Страница: 1 | 2 |
Вопрос: Выгрузка DLL из процесса
Добавлено: 02.09.07 23:33
Автор вопроса: Mr.Smile | ICQ: 427682013
Всем привет! Как выгрузить DLL из собственного процесса? Например: Вызвал я диалог открытия файлов, загрузилась в процесс библиотека comdlg32.dll. После этого мне нужно выгрузить эту библиотеку (принудительно, даже если активна) из процесса.
Вот код, который находит хэндл библиотеки, но не может её выгрузить:
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Sub Form_Load()
Dim hLib As Long
Dim lRet As Long
hLib = GetModuleHandle("user32.dll")
If hLib <> 0 Then
lRet = CloseHandle(hLib)
MsgBox "Библиотека выгружена: " & CBool(lRet)
Else
MsgBox "Библиотека не загружена!", vbExclamation
End If
End Sub
Помогите исправить.
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #1
Добавлено: 03.09.07 00:16
а разве выгружать надо не через
FreeLibrary(hLib as long)
Номер ответа: 2
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #2
Добавлено: 03.09.07 14:47
Блин, чё-то раньше не работало... Спасибо. Но! FreeLibrary может выгружать только неиспользуемые библиотеки. Как выгружать любую библиотеку из процесса принудительно?
Вот код на сей момент: (добавить Command1)
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Sub Command1_Click()
Dim hLib As Long
Dim lRet As Long
hLib = GetModuleHandle("shlwapi.dll"
If hLib <> 0 Then
lRet = FreeLibrary(hLib)
MsgBox "Библиотека выгружена: " & CBool(lRet)
Else
MsgBox "Библиотека не загружена!", vbExclamation
End If
End Sub
Номер ответа: 3
Автор ответа:
udpn
Вопросов: 2
Ответов: 45
Профиль | | #3
Добавлено: 03.09.07 15:15
CloseHandle никто не отменял. Закрыть хэндл надо обязательно, будут глюки!
Номер ответа: 4
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #4
Добавлено: 03.09.07 15:18
Так он не находит это хэндл. Возвращает 0. Т.е. нефига не закрывает
Номер ответа: 5
Автор ответа:
udpn
Вопросов: 2
Ответов: 45
Профиль | | #5
Добавлено: 03.09.07 17:02
Private Sub Command1_Click()
 im hLib As Long
 im lRet As Long
hLib = GetModuleHandle("shlwapi.dll"
If hLib <> 0 Then
lRet = FreeLibrary(hLib)
MsgBox "Библиотека выгружена: " & CBool(lRet)
Else
MsgBox "Библиотека не загружена!", vbExclamation
End If
CloseHandle hLib
End Sub
Номер ответа: 6
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #6
Добавлено: 03.09.07 20:21
Повторюсь:
Номер ответа: 7
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #7
Добавлено: 03.09.07 20:26
P.S.: Функция CloseHandle (как и большинство других) не выполнив своё предназначение возвращает либо 0 (не выполнено) либо код ошибки. В нашем случае она возвращает 0.
Номер ответа: 8
Автор ответа:
udpn
Вопросов: 2
Ответов: 45
Профиль | | #8
Добавлено: 03.09.07 23:06
хэндлы надо закрывать, хоть апстенубейся! результаты, возвращаемые функциями этого факта не меняют
Номер ответа: 9
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #9
Добавлено: 03.09.07 23:23
Если-бы я открывал хэндл например функцией
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 04.09.07 19:21
помойму, все хенделы которые были открыты процессом закрываются при его завершении. Конфликты возникают если работают копии программы, или несколько программ работают с одними и темеже ресурсами (файлами, памятью итп). Поэтому рекомендуется сразу закрывать ненужные хенделы.
Номер ответа: 11
Автор ответа:
udpn
Вопросов: 2
Ответов: 45
Профиль | | #11
Добавлено: 04.09.07 20:37
блин, потерял звездочки, теперь не слушают ))
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 04.09.07 21:40
freelibrary и все дела. выгрузит что угодно, и не важно используется-ли она.
Номер ответа: 13
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #13
Добавлено: 04.09.07 23:19
2 HACKER Работает одна программа, без копий
2 udpn
2 sne Ну ладно, user32.dll я выгружать не собираюсь.
2 ALL Как выгружать библиотеки "безболезненно"? То есть, например использовал я диалог открытия файлов (comdlg32.dll), загрузился он в память. После использования я его закрываю (FreeLibrary), а при повторном его вызове Доктор Ватсон забирает мою прогу (вылетает вообщем)
Номер ответа: 14
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #14
Добавлено: 05.09.07 01:45
Arcady Я чего-то не понял может быть...
НО
Ты воспользовался библиотекой и выгрузил её через Freelibrary.
А потом пытаешься вызывать функции из нее?!
Без LoadLibrary?!
Номер ответа: 15
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #15
Добавлено: 06.09.07 16:51
Ну да! Она по идее сама загружается при вызове функции. Или потом надо будет её загружать вручную?