Re[4]: Detected memory leaks при вызове AfxFreeLibrary
От: Alex_Bukreev  
Дата: 13.05.09 15:21
Оценка:
Здравствуйте, Melamed, Вы писали:

M>Глюк явно в DLL, которую вы загружаете, а точнее в функции DllMain, которая вызывается при загрузки и выгрузке динамической библиотеки. Наверняка при загрузки библиотеки создается элемент класса, а при выгрузке он не уничтожается, что ведет к утечки памяти в программе


M>Вот пример, как должна быть написана DllMain функция в библиотеки



M>
M>Array2D *Temp;

M>BOOL APIENTRY DllMain( HANDLE hModule, 
M>                       DWORD  ul_reason_for_call, 
M>                       LPVOID lpReserved
M>                     )
M>{
M>    switch(ul_reason_for_call)
M>    {
M>    case DLL_PROCESS_ATTACH:
M>        {
M>// Выполняется при загрузки библиотеки
M>            Temp = new Array2D;
M>            break;
M>        }
M>    case DLL_PROCESS_DETACH:
M>        {
M>// Выпольняется при выгрузке библиотеки
M>            delete Temp; 
M>            break;
M>        }
M>    }
M>    return TRUE;
M>}

M>



Я не изменял функцию DllMain, созданую студией, вот её код:
static AFX_EXTENSION_MODULE MyDLLDLL = { NULL, NULL };

#ifdef _MANAGED
#pragma managed(push, off)
#endif

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("MyDLL.DLL Initializing!\n");
        
        // Extension DLL one-time initialization
        if (!AfxInitExtensionModule(MyDLLDLL, hInstance))
            return 0;

        // Insert this DLL into the resource chain
        // NOTE: If this Extension DLL is being implicitly linked to by
        //  an MFC Regular DLL (such as an ActiveX Control)
        //  instead of an MFC application, then you will want to
        //  remove this line from DllMain and put it in a separate
        //  function exported from this Extension DLL.  The Regular DLL
        //  that uses this Extension DLL should then explicitly call that
        //  function to initialize this Extension DLL.  Otherwise,
        //  the CDynLinkLibrary object will not be attached to the
        //  Regular DLL's resource chain, and serious problems will
        //  result.

        new CDynLinkLibrary(MyDLLDLL);

    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        TRACE0("MyDLL.DLL Terminating!\n");

        // Terminate the library before destructors are called
        AfxTermExtensionModule(MyDLLDLL);
    }
    return 1;   // ok
}

#ifdef _MANAGED
#pragma managed(pop)
#endif
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.