CCmdTarget



  • Hallo liebe Kritiker,

    ich habe ein Problem mit dem m_dwRef Zähler meiner DLL.

    ExeptionPunkt aus MFC - CMDTARG.CPP Ausschnitt:

    CCmdTarget::~CCmdTarget()
    {
    	if (m_xDispatch.m_vtbl != 0)
    		((COleDispatchImpl*)&m_xDispatch)->Disconnect();
    	ASSERT(m_dwRef <= 1);
    	m_pModuleState = NULL;
    }
    

    Callstack sah so aus:

    >	TwainWrapD.exe!CCmdTarget::~CCmdTarget() Line 40	C++
     	TwainWrapD.exe!COleMessageFilter::~COleMessageFilter() Line 50	C++
     	TwainWrapD.exe!COleMessageFilter::`scalar deleting destructor'(unsigned int)	C++
     	TwainWrapD.exe!AfxOleTerm(int bJustRevoke=0) Line 111	C++
     	TwainWrapD.exe!AfxOleTermOrFreeLib(int bTerm=1, int bJustRevoke=0) Line 136	C++
     	TwainWrapD.exe!AfxWinTerm() Line 44	C++
     	TwainWrapD.exe!AfxWinMain(HINSTANCE__ * hInstance=0x00080000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00d72b7b, int nCmdShow=10) Line 62	C++
     	TwainWrapD.exe!WinMain(HINSTANCE__ * hInstance=0x00080000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00d72b7b, int nCmdShow=10) Line 26	C++
     	TwainWrapD.exe!__tmainCRTStartup() Line 251	C
     	TwainWrapD.exe!WinMainCRTStartup() Line 165	C
     	kernel32.dll!778cee1c()	Unknown
     	[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]	
     	ntdll.dll!77be37eb()	Unknown
     	ntdll.dll!77be37be()	Unknown
    

    Hier wird mit Assert eine Exception geworfen da m_dwRef = 2 ist !?

    Es Handelt sich um eine eigene DLL die in InitInstanze eine
    Klasse mit new erzeugt, und in ExistInstanz diese mit
    delete wieder frei gibt.

    Diese Klasse lädt nach InitInstance eine Dll : (Twain_32.dll)
    über die Exportierte Methode "Create" nach:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    Diese Klasse entlädt vor ExitInstanz eine DLL : (Twain_32.dll)
    über die Exportierte Methode "Delete" nach:
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); als Export funktin darstellt.

    Wie kann es sein das der RefZähler auf 2 Steht, wird dieser mit jedem Laden einer weiteren DLL Hochgezählt ? Warum zählt der nicht runter ?

    Ich habe hier ein Verständnis defizit.

    Vielen Dank für Hilfen
    Gruß K.


Log in to reply