Funktionsaufruf in OnConnect CAsyncSocket wird nicht vollständig ausgeführt
-
Hallo.
Ich versuche für meine WinCE Anwendung Sockets zu verwenden. Dabei möchte ich im OnConnect Ereignis Handler ein paar Controls auf meiner Form ändern. Dazu rufe ich in OnConncet eine Funktion meiner View Klasse auf.
Das funktioniert soweit auch. Nur je nach dem was in der Funktion drin steht wird sie nur teilweise, oder mit einer AccessViolation ausgeführt. Löse ich diese Funktion über einen Button aus, funktioniert sie.
Das ist die Funktion:
void CMyAppView::Connected(bool value) { CBitmap TempBmp; if(value) { RETAILMSG(1, (_T("then\r\n"))); m_sConnected = _T("Connected"); // Abbruch Invalidate(); // AV (im debug) TempBmp.LoadBitmapW(IDB_BITMAP_CONNECTED_TRUE); // OK m_PictureConnected.SetBitmap(TempBmp); // AV (im debug) m_PictureConnected.Invalidate(); // AV (im debug) //m_TempBmp.Detach(); RETAILMSG(1, (_T("then #2\r\n"))); } else { ... ... } }
Ich habe mal alle Zeilen bis auf eine auskommentiert um zu sehen was passiert.
- Wenn die Stringzuweisung einkommentiert ist, wird die Funktion nur bis da ausgeführt und 'bricht dann ab'.
- Die AccessViolatens kommen nur wenn ich als debug kompilieren. Als release kommt keine AVDie AV lautet
Debug Assertion Failed!
Program: \xyz.exe
File:f:\dd\vctools\vc7libsce\ship\atl
mfx\include\afxwin2.inl
Line: 158(Press Retry to debug the application)
Bitte um Hilfe.
Vielen Dank.
-
ViktorII schrieb:
Dazu rufe ich in OnConncet eine Funktion meiner View Klasse auf.
Zeig den Teil bitte mal.
-
Das sieht im Moment so aus:
void CMySocket::OnConnect(int nErrorCode) { RETAILMSG(1, (_T("OnConnect: %d\r\n"), nErrorCode)); if(nErrorCode == 0) { RETAILMSG(1, (_T("OnConnect #1\r\n"))); ((CMyAppView *)m_pWnd)->Connected(true); RETAILMSG(1, (_T("OnConnect #2\r\n"))); } else { CString ErrorString; ErrorString.Format(_T("CMySocket::OnConnect Error: %d"), nErrorCode); AfxMessageBox(ErrorString, MB_OK | MB_ICONSTOP); } RETAILMSG(1, (_T("OnConnect #3\r\n"))); CAsyncSocket::OnConnect(nErrorCode); RETAILMSG(1, (_T("OnConnect #4\r\n"))); }
-
ViktorII schrieb:
((CMyAppView *)m_pWnd)->Connected(true);
Der Cast ist schon mal verdächtig. Prüf mal, wohin m_pWnd eigentlich zeigt. Am besten mit dem Debugger.
-
Das war schon mal ein guter Hinweis. Habe hier nicht das CMyAppView sondern das CMyAppApp handle übergeben...
Um das Fensterhandle in meiner Socket Klasse zu haben mache ich folgendes:
void CMySocket::SetParent(CMyAppView *pWnd) { m_pWnd = pWnd; }
Die Funktion rufe ich in InitInstance von App auf:
BOOL CMyAppApp::InitInstance() { if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE; } m_pMySocket = new CMySocket; m_pMySocket->SetParent(???);
Nur muss ich hier ja das Fensterhandle übergeben, sprich von CMyAppView. Nur wie komme ich daran? Habe mal bei this->Getxxx geschaut, da aber nix gefunden...
-
Zu diesem Zeitpunkt (InitInstance) gibt es noch gar keine Instanz der View-Klasse.
Ruf SetParent auf, wenn die View wirklich erstellt wird.