Anwendung verliert Handle bei Send Message und Funktionsaufruf



  • Guten Morgen Community,

    und zwar hab ich folgendes Problem:

    Ich habe eine MDI Anwendung, von der ich von der MainFrame Klasse
    eine Eigene Message an einen anderen Dialog sende ( CTest ). In dem Dialog
    fange ich in CTest::PreTranslateMessage die Message ab und rufe eine Funktion
    in der Rahmen Klasse ( CTestScrollDlg::OnBnClicked1() ) auf, diese dann auf ein ActiveX Control zugreift.

    Ich habe für einen Dialog praktisch 2 Klassen, also eine Dialog Klasse und
    eine Rahmenklasse zum Scrollen, diese so definiert sind:

    class CTestScrollDlg : public CDialogEx
    class CTest : public CDockablePane
    

    Sie werden folgender Maßen zusammengefügt und definiert:

    CDockablePane* m_dlgTest ;
    CDockablePane* m_spliteTest;
    
    void CMainFrame::OnViewTest()
    {
            if(m_dlgTest&&m_dlgTest->GetSafeHwnd()){m_dlgTest >ShowPane(TRUE,FALSE,TRUE);return ;}
    
            m_dlgTest = new CTest;
    
            UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
            CString strTitle = _T("Anzeige");
    
            if (!m_dlgTest->Create(strTitle, this, CRect(0, 0, 2000, 4000), TRUE,     IDD_DIALOG_TEST, style,AFX_CBRS_OUTLOOK_TABS))
    	{
    		TRACE0("Failed to create dialog pane\n");
    		SAFE_DELETE(m_dlgTest);
    		return ; 
    	}
    
    	m_dlgTest->EnableDocking(CBRS_ALIGN_ANY);
    	DockPane((CBasePane*)m_dlgAnzeige,AFX_IDW_DOCKBAR_BOTTOM);
    	CDockablePane* pTabbedBar = NULL;
    	if(m_spliteTest && m_spliteTest->GetSafeHwnd()) m_dlgTest->AttachToTabWnd(m_spliteTest, DM_SHOW, TRUE, &pTabbedBar);
    	else m_dlgTest->ShowPane(TRUE,FALSE,TRUE);
    	RecalcLayout();
    
    	m_bTest = 1;
    	m_dlgTest->MoveWindow(CRect(0, 0, 2000, 4000),1);
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    /// <summary>OnCreate</summary>
    int CTest::OnCreate(LPCREATESTRUCT lp)
    {
    	pDC = GetDC();
    	if(pDC == 0) { MessageBox("Kein DC vorhanden !!!"); return -1; }
    
    	if(CDockablePane::OnCreate(lp)==-1)
    		return -1;
    	if(!m_wndDlg.Create(CTestScrollDlg::IDD,this))
    		return -1;
    	m_wndDlg.ShowWindow(SW_SHOWDEFAULT);
    	return  0;
    }
    

    Mein Problem ist jetzt, dass wenn ich aus der CTestScrollDlg::OnBnClicked1() Funktion auf ein ActiveX Control in der CTestScrollDlg Klasse zugreife,
    dann hat das ActiveX Control ein NULL Handle und das Programm steigt aus bei ASSERT(m_pCtrlSite != NULL):

    void AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
    void* pvRet, const BYTE* pbParamInfo, ...)
    {
    	ASSERT(m_pCtrlSite != NULL);    // not an OLE control (not yet, at least)
    
    	if (m_pCtrlSite == NULL)
    		return;
    
    	va_list argList;
    	va_start(argList, pbParamInfo);
    	m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,
    		argList);
    	va_end(argList);
    }
    

    Wenn ich ein normalen Butten in die Klasse CTestScrollDlg einfüge und dort direkt das ActiveX anspreche, dann funktioniert es.

    Falls ich noch etwas genauer erläutern muss, dann gebt bitte Bescheid.

    Vielen Dank,
    pmb


  • Mod

    Wen pCtrlSite NULL Ist ist das Control nicht angelegt.
    Was soll man jetzt sonst dazu sagen?

    Schau Dir an welche Objekte Du benutzt und ob die wirklich korrekt erzeugt wurden.



  • Das Control muss aber angelegt sein. Wenn ich auf ein Button klicke auf dem Dialog, auf dem auch das ActiveX Control ist, dann funktioniert es und das Handle ist vorhanden. Mach ich dann den Aufruf wieder über die SendMessage Variante, dann ist das Handle wieder NULL.

    Es ist wie wenn er das Handle verliert, sobald ich den Aufruf über SendMessage mache. Kanns da Probleme mit der Vererbung geben ?

    Gruß pmb


  • Mod

    Dann schau doch in CTest::OnCreate nach...
    Entweder verwendest Du ein anderes Objekt, aber wenn an der Stelle der Zeiger NULL ist wurde kein Objekt erzeugt. Punkt!

    Derist doch nicht "aus Spaß" NULL



  • Hallo,

    hab es jetzt gelöst.
    Bin draufgekommen nachdem ich nochmals genau die OnCreate angeschaut habe ( Danke Martin 👍 ). Im OnCreate war schon ein Objekt vorhanden wo angelegt wird ( m_wndDlg ). Mit diesem konnte ich Problemlos darauf zugreifen.


Anmelden zum Antworten