DLL/lib загрузка/выгрузка
От: bel_nikita  
Дата: 29.11.04 09:54
Оценка:
Скомпилил ДЛЛ и Либу:
LaserScanner.cpp
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
      //MessageBox(GetFocus(),"asdasdadadasd","3453355",MB_OK);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
      MessageBox(GetFocus(),"Closing Dll","DETACH",MB_OK);
            break;
    }
    return TRUE;
}

В аппликации делаю следующие:
#include ".\LaserScanner\LaserScanner.h"
#ifdef _DEBUG
  #pragma comment(lib,".\\LaserScanner\\Debug\\LaserScanner.lib")
#else
  #pragma comment(lib,".\\LaserScanner\\Release\\LaserScanner.lib")
#endif
...
LaserScannerSomeFunction(TRA_LA_LA);
...

Итересует в какой момент происходит загрузка ДЛЛ и выгрузка?
Если загрузка работает, т.е. ДЛЛ загружается и LaserScannerSomeFunction выполняется, то вот с выгрузкой проблемы . MessageBox — никогда не выкидывается. Как произвести выгрузку ДЛЛ?

З.Ы.: или вообще чушь порю?
Re: DLL/lib загрузка/выгрузка
От: frozen83 Россия не покажу
Дата: 29.11.04 10:04
Оценка:
Здравствуйте, bel_nikita, Вы писали:

_>Скомпилил ДЛЛ и Либу:

_>LaserScanner.cpp
_>
_>BOOL APIENTRY DllMain( HANDLE hModule, 
_>                       DWORD  ul_reason_for_call, 
_>                       LPVOID lpReserved
_>                     )
_>{
_>    switch (ul_reason_for_call)
_>    {
_>        case DLL_PROCESS_ATTACH:
_>      //MessageBox(GetFocus(),"asdasdadadasd","3453355",MB_OK);
_>            break;
_>        case DLL_THREAD_ATTACH:
_>            break;
_>        case DLL_THREAD_DETACH:
_>            break;
_>        case DLL_PROCESS_DETACH:
_>      MessageBox(GetFocus(),"Closing Dll","DETACH",MB_OK);
_>            break;
_>    }
_>    return TRUE;
_>}
_>

_>В аппликации делаю следующие:
_>
_>#include ".\LaserScanner\LaserScanner.h"
_>#ifdef _DEBUG
_>  #pragma comment(lib,".\\LaserScanner\\Debug\\LaserScanner.lib")
_>#else
_>  #pragma comment(lib,".\\LaserScanner\\Release\\LaserScanner.lib")
_>#endif
_>...
_>LaserScannerSomeFunction(TRA_LA_LA);
_>...
_>

_>Итересует в какой момент происходит загрузка ДЛЛ и выгрузка?
_>Если загрузка работает, т.е. ДЛЛ загружается и LaserScannerSomeFunction выполняется, то вот с выгрузкой проблемы . MessageBox — никогда не выкидывается. Как произвести выгрузку ДЛЛ?

_>З.Ы.: или вообще чушь порю?



Если я не ошибаюсь, то когда ты подключаешь dll таким образом (через lib файл) то загрузка происходит перед( ) запуском программы, а выгрузка после её завершения (наверное как мусор чистится). Если желаешь их выгружать попробуй писать:

HMODULE LoadLibrary(
LPCTSTR lpFileName
);

и

FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);

и

BOOL FreeLibrary(
HMODULE hModule
);
Re: DLL/lib загрузка/выгрузка
От: TarasCo  
Дата: 29.11.04 10:06
Оценка:
Здравствуйте, bel_nikita, Вы писали:

_>Скомпилил ДЛЛ и Либу:

_>LaserScanner.cpp
_>
_>BOOL APIENTRY DllMain( HANDLE hModule, 
_>                       DWORD  ul_reason_for_call, 
_>                       LPVOID lpReserved
_>                     )
_>{
_>    switch (ul_reason_for_call)
_>    {
_>        case DLL_PROCESS_ATTACH:
_>      //MessageBox(GetFocus(),"asdasdadadasd","3453355",MB_OK);
_>            break;
_>        case DLL_THREAD_ATTACH:
_>            break;
_>        case DLL_THREAD_DETACH:
_>            break;
_>        case DLL_PROCESS_DETACH:
_>      MessageBox(GetFocus(),"Closing Dll","DETACH",MB_OK);
_>            break;
_>    }
_>    return TRUE;
_>}
_>

_>В аппликации делаю следующие:
_>
_>#include ".\LaserScanner\LaserScanner.h"
_>#ifdef _DEBUG
_>  #pragma comment(lib,".\\LaserScanner\\Debug\\LaserScanner.lib")
_>#else
_>  #pragma comment(lib,".\\LaserScanner\\Release\\LaserScanner.lib")
_>#endif
_>...
_>LaserScannerSomeFunction(TRA_LA_LA);
_>...
_>

_>Итересует в какой момент происходит загрузка ДЛЛ и выгрузка?
_>Если загрузка работает, т.е. ДЛЛ загружается и LaserScannerSomeFunction выполняется, то вот с выгрузкой проблемы . MessageBox — никогда не выкидывается. Как произвести выгрузку ДЛЛ?

_>З.Ы.: или вообще чушь порю?



Попробуйте в мессадж боксе первым параметром поставить 0 — после этого IMHO сообщение должно появляться
Да пребудет с тобою сила
Re[2]: DLL/lib загрузка/выгрузка
От: BlackHeretic Израиль  
Дата: 29.11.04 11:11
Оценка:
Здравствуйте, frozen83, Вы писали:

F>Здравствуйте, bel_nikita, Вы писали:



F>Если я не ошибаюсь, то когда ты подключаешь dll таким образом (через lib файл) то загрузка происходит перед( ) запуском программы, а выгрузка после её завершения (наверное как мусор чистится). Если желаешь их выгружать попробуй писать:


F>HMODULE LoadLibrary(

F> LPCTSTR lpFileName
F>);

F>и


F>FARPROC GetProcAddress(

F> HMODULE hModule,
F> LPCSTR lpProcName
F>);

F>и


F>BOOL FreeLibrary(

F> HMODULE hModule
F>);

Если нужно принудительно выгрузить то не LoadLibrary, а GetModuleHandle. Иначе FreeLibrary тока уменьшит счетчик загрузок.
Код который точно должен работать:


while(::FreeLibrary(::GetModuleHandle(_T("MyLib.dll"))))
    ;
ICQ 156156278
Re[2]: DLL/lib загрузка/выгрузка
От: bel_nikita  
Дата: 29.11.04 11:28
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Попробуйте в мессадж боксе первым параметром поставить 0 — после этого IMHO сообщение должно появляться


Неа, нету мессадж бокса
Сделал так:

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
      MessageBox(GetFocus(),"asdasdadadasd","3453355",MB_OK);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
      MessageBox(0,"Closing Dll","DETACH",MB_OK);
            break;
        case DLL_PROCESS_DETACH:
      MessageBox(0,"Closing Dll","DETACH",MB_OK);
            break;
    }
    return TRUE;
}
Re[3]: DLL/lib загрузка/выгрузка
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 29.11.04 11:37
Оценка:
Здравствуйте, bel_nikita, Вы писали:

_>Неа, нету мессадж бокса


Calling Win32 functions other than TLS, object-creation, and file functions may result in problems that are difficult to diagnose. For example, calling User, Shell, COM, RPC, and Windows Sockets functions (or any functions that call these functions) can cause access violation errors, because their DLLs call LoadLibrary to load other system components. While it is acceptable to create synchronization objects in DllMain, you should not perform synchronization in DllMain (or a function called by DllMain) because all calls to DllMain are serialized. Waiting on synchronization objects in DllMain can cause a deadlock.

[ posted via RSDN@Home 1.1.4 beta 3 r239 ]
- Искренне ваш, Поросенок Пафнутий
Re[3]: DLL/lib загрузка/выгрузка
От: bel_nikita  
Дата: 29.11.04 11:41
Оценка:
Здравствуйте, BlackHeretic, Вы писали:

BH>Если нужно принудительно выгрузить то не LoadLibrary, а GetModuleHandle. Иначе FreeLibrary тока уменьшит счетчик загрузок.

BH>Код который точно должен работать:

BH>
BH>while(::FreeLibrary(::GetModuleHandle(_T("MyLib.dll"))))
BH>    ;
BH>


Тоже самое Нету мессадж бокса
Re[4]: DLL/lib загрузка/выгрузка
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.04 11:56
Оценка:
Здравствуйте, bel_nikita, Вы писали:

_>Тоже самое Нету мессадж бокса


брось ты этот мессаджбокс, используй OutputDebugString или точку останова в отладчике.
Re[4]: DLL/lib загрузка/выгрузка
От: bel_nikita  
Дата: 29.11.04 11:59
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>

SDB>Calling Win32 functions other than TLS, object-creation, and file functions may result in problems that are difficult to diagnose. For example, calling User, Shell, COM, RPC, and Windows Sockets functions (or any functions that call these functions) can cause access violation errors, because their DLLs call LoadLibrary to load other system components. While it is acceptable to create synchronization objects in DllMain, you should not perform synchronization in DllMain (or a function called by DllMain) because all calls to DllMain are serialized. Waiting on synchronization objects in DllMain can cause a deadlock.

Ничего не понял Понял, что у меня может быть много проблем, виалейшинов. Понял, что в ДллМайн синхронизационные объекты вставлять нельзя. Но так не понял почему не выскакивает Мессадж бокс при выходе Да и LoadLibrary у меня в программе нигде нет, точнее есть, но это уже компилятор делает за меня
Re[5]: DLL/lib загрузка/выгрузка
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 29.11.04 12:03
Оценка:
Здравствуйте, bel_nikita, Вы писали:

_>Ничего не понял Понял, что у меня может быть много проблем, виалейшинов. Понял, что в ДллМайн синхронизационные объекты вставлять нельзя. Но так не понял почему не выскакивает Мессадж бокс при выходе


Потому что поведение винды при вызове функций из user32.dll (к коим относится и MessageBox) является... м-м-м... неопределенным — может показать, может не показать, может вообще процесс повесить.
[ posted via RSDN@Home 1.1.4 beta 3 r239 ]
- Искренне ваш, Поросенок Пафнутий
Уточнение
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 29.11.04 12:04
Оценка:
SDB>Потому что поведение винды при вызове функций из user32.dll (к коим относится и MessageBox) является... м-м-м... неопределенным — может показать, может не показать, может вообще процесс повесить.

Имеется ввиду — вызов изнутри DllMain().
[ posted via RSDN@Home 1.1.4 beta 3 r239 ]
- Искренне ваш, Поросенок Пафнутий
Re: DLL/lib загрузка/выгрузка
От: bel_nikita  
Дата: 29.11.04 12:12
Оценка:
Разобрался
Нашел ошибку в своей аппликации. У меня при выходе прога попадала в рекурсию функцию
Re[2]: DLL/lib загрузка/выгрузка
От: BlackHeretic Израиль  
Дата: 29.11.04 12:21
Оценка:
Здравствуйте, bel_nikita, Вы писали:

_>Разобрался

_>Нашел ошибку в своей аппликации. У меня при выходе прога попадала в рекурсию функцию

А-а-а!!!
ICQ 156156278
Re: DLL/lib загрузка/выгрузка
От: Sheridan Россия  
Дата: 29.11.04 12:53
Оценка:
Мучался я както, пытался создавать/удалять класс в DllMain при загрузке \ выгрузке да так и бросил. Такое впечатление что DllMain либо вообче не выполняется. либо какимто якорем выполяется в отдельном потоке...
-=RSDN@Home 1.1.4 beta 3 rev. 240=- [Jean Michel Jarre — Equinoxe 7 (ambient mix)]
Matrix has you...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.