Здравствуйте, 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