Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Выгрузка DLL из процесса Добавлено: 02.09.07 23:33  

Автор вопроса:  Mr.Smile | ICQ: 427682013 
Всем привет! Как выгрузить DLL из собственного процесса? Например: Вызвал я диалог открытия файлов, загрузилась в процесс библиотека comdlg32.dll. После этого мне нужно выгрузить эту библиотеку (принудительно, даже если активна) из процесса.
Вот код, который находит хэндл библиотеки, но не может её выгрузить:
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
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-сайт: winandfx.narod.ru
 Профиль | | #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)
Option Explicit

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()
    ;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
    CloseHandle hLib
End Sub

Ответить

Номер ответа: 6
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #6 Добавлено: 03.09.07 20:21
Повторюсь:
...находит это хэндл. Возвращает 0.
А следовательно, закрытия не произошло. А во-вторых, это ни коем образом не влияет на крах приложения. (появляется при повторном вызове библиотеки =))

Ответить

Номер ответа: 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
Если-бы я открывал хэндл например функцией
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
. При закрытии она возвращает 1. Почитай поподробней про функции и о возвращаемых ими значениях. И не надо говорить что в моём случае функция Close Handle работает, и, тем более, что-то меняет!

Ответить

Номер ответа: 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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #14
Добавлено: 05.09.07 01:45
Arcady Я чего-то не понял может быть...
НО
Ты воспользовался библиотекой и выгрузил её через Freelibrary.
А потом пытаешься вызывать функции из нее?!
Без LoadLibrary?!

Ответить

Номер ответа: 15
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #15 Добавлено: 06.09.07 16:51
:) Ну да! Она по идее сама загружается при вызове функции. Или потом надо будет её загружать вручную?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам