Как правильно удалить потомка(dll) родителем(Exe)?

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 22 янв 2008.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день.

    Exe из ресурсов выбрасывает dll и запускает из
    нее функцию (которая шлет письмо серез SMTP).

    Дальше хочу удалить эту dll из Exe - родителя.

    Подскажите как правильно это сделать для XP\Vista ...

    Спасибо.
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Поиск по форуму на тему "как писать в работающий ехе"
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    то есть ...

    main
    {

    LoadLibrary()
    GetProcAddress()
    call mydll.myfun()
    CreateThread(... _fun_del_dll()...)
    }
    _fun_del_dll()
    {
    FreeLibrary()
    DeleteFile()
    }
    ... так?
     
  4. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    да.. но если вы делаете несколько раз LoadLibrary? то вам прийдется и несколько раз делать FreeLibrary
    черновой вариант так
    repeat
    i:=GetModuleHandle;
    FreeLibrary(i);
    until i<>0

    сори за поскаль)
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    ла = да?

    а i:=GetModuleHandle; - выполнять где?
    - в Exe
    - в mydll
    - в _fun_del_dll()
    то есть на выходе GetModuleHandle() я получу чей Handle ?
     
  6. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    GetModuleHandle(smtpdll)
    просто если вы зделаете FreeLibrary один раз не факт что длл выгрузится
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    lapslap

    то есть так, я правильно понял ...

    main
    {
    ...
    LoadLibrary()
    GetProcAddress()
    call mydll.myfun()
    CreateThread(... _fun_del_dll()...)
    }
    _fun_del_dll()
    {
    repeat
    FreeLibrary(GetModuleHandle(mydll));
    until i<>0
    DeleteFile()
    }
    ... так?
     
  8. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    _sheva740
    Давайте сразу определимся.
    Если нужно удалить отдельный файл, то:

    hLibrary=LoadLirary() - тут мы сохраняем хэндл

    а при удалении

    FreeLibrary(hLibrary)
    DeleteFile(szLibraryName)


    ---------------
    А если нужно удалить длл непосредственно из файла ехе, т.е. зачистить ресурсы, то тут способ несколько иной.
    Необходимо создать новый процесс (не поток!) и закрыть целевой. С нового процесса отредактировать файл.
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ну вообще-то она не хендл принимает, ну а так вообщем-то да
    _sheva740 и что конкретно не получается?
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    rain

    да вот

    Код (Text):
    1.         ...
    2.     _sma            db 'sma.dll',0
    3.     _smail           db 'smail',0
    4.     dwDamnStuff dd  0
    5.     INFINITE           =   0FFFFFFFFh
    6. ;************************************************************************
    7.     start:
    8.     ...
    9.    
    10.     push    _sma                         ; Загружаем библиотеку
    11.     call    [LoadLibrary]                ; которую мы извлекли
    12.     test    eax,eax                      ; Выходим в
    13.     je  exit                            ; случае ошибки
    14.    
    15.     mov [dwDamnStuff],eax
    16.    
    17.     push    _smail                       ;
    18.     push    eax                          ; Ищем функцию
    19.     call    [GetProcAddress]         ; '_smail'
    20.     test    eax,eax                     ; Выходим в
    21.     je  exit                           ; случае ошибки
    22.  
    23.     call    eax                           ; вызываем эту функцию
    24.  
    25.  
    26.  
    27.     invoke  CreateThread, 0, 0, clsmadll, 0, 0, 0
    28.     push    eax
    29.     invoke  WaitForSingleObject, eax, INFINITE
    30.  
    31.  
    32.  
    33. ;************************************************************************
    34. proc clsmadll
    35.  
    36. @@: push    dwDamnStuff              ; Выгружаем библиотеку
    37.     call         [FreeLibrary]               ; которую мы извлекли
    38.     invoke     GetModuleHandle,_sma
    39.     test        eax,eax
    40.     jne     @B
    41.  
    42.  
    43.     push    _sma                            ; Удалим существующий
    44.     call    [DeleteFile]                      ; файл если он есть
    45.     ret
    46. endp
    После запуска этой exe - ки sma.dll не удаляется :dntknw:
     
  11. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Учитесь задавать вопросы нормально, уважайте своё время и других, если бы ты сказал какая именно функция и где бочинит я бы потратил времени меньше, короче вот пример работает нормально проверяй, сверяё что у тебя не так

    Download-Link #1: http://rapidshare.com/files/85993450/Projects.zip.html
    Delete-Link #1: http://rapidshare.com/files/85993450/Projects.zip?killcode=17012653788414623040
     
  12. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    rain
    будем учиться , спасибо