Fehler bei AfxRegisterWndClass



  • Moin,

    ich versuche gerade ein von mir früher programmiertes Programm in einen Windows Dienst umzuschreiben. Das Programm habe ich früher unter VC++ 6.0 geschrieben. Mittlerweile bin ich auf VC++ 2003 umgestiegen. Also habe ich einen .NET Dienst erstellt und habe meine alten Klassen in das Projekt eingefügt. Da es kein Problem ist managed und unmanaged code in einem Projekt zu verwenden habe ich an dieser Stelle nicht mit Problemen gerechnet. Jetz bekomme ich folgende Fehlermeldung:

    Debug Assertion Faild!
    File: f:\vs70builds\3077\vc\MFCALT\ship\atlmfc\include\afxwin1.inl
    Line: 23

    An der Stelle an der, der Fehler auftritt, erstelle ich ein unsichtbares Fenster:

    HWND CInvisibleWindow::Create()
    {
    	//Register a window class
    	LPCTSTR classname = 0;
    	classname = AfxRegisterWndClass(0);
    
    	//Create the window and return it's handle
    	CWnd::CreateEx(NULL,classname,NULL,NULL,1,1,1,1,NULL,NULL);
    	ASSERT(m_hWnd!=NULL);
    	return m_hWnd;
    }
    

    Der Fehler tritt in der Funktion AfxRegisterWndClass auf. Leider habe ich von der MFC nicht sehr viel Ahnung. Muss ich noch irgend einen Schalter einschalten??
    Ich stehe gerade sehr ratlos da. Wo kann ich nach diesem Fehler suchen...

    (Wenn es eher ein .NET Problem ist -> bitte verschieben)



  • Hi,

    wahrscheinlich classname kann nicht NULL sein. Gib dort eine wahre Name.

    Fredy



  • Hallo,

    danke für deine Antwort.
    Aber classname wird ja von AfxRegisterWndClass gesetzt. Die Fehlermeldung bekomme ich ja nicht bei CWnd::CreateEx() sonder schon bei AfxRegisterWndClass(0). Die übergeben 0 beschreibt nur den ClassStyle.
    Oder habe ich dich falsch verstanden?

    Gruß
    credix



  • In Diensten soll/darf man eh keine Fenster erstellen.



  • Dein Kommentar ist nicht sehr hilfreich. Um zwischen Threads zu kommunizieren bieten sich Messages eben an. Und dafür brauchst du eben ein window. Übrigens das ist das keine Idee von mir gewesen sondern von Microsoft. Der Code oben stammt fast 1:1 aus der MSDN ...

    Gruß
    credix



  • Warum soll man für Messages ein Window brauchen?

    Jeder Thread hat in Windows ne Message Queue, also einfach nen Thread erstellen, GetMessage reinpacken und sich drüber freuen. 😉 Dann kannste dir das Window sparen und mit PostThreadMessage arbeiten.

    Mit .net hat das übrigens überhaupt nichts zu tun. ^^



  • Und es geht weiter ...

    Zu erst einmal Danke M.
    Was du geschrieben hast war mir noch nicht bewusst. Ich habe mein Programm daraufhin abgeändert und habe die Fenster aus meiner Anwendung gelöscht.
    Leider bekomme ich die Fehlermeldung immer noch, bloß an anderer Stelle. In einem meiner Threads erstelle ich einen Listen Socket mit Hilfe der Klasse CAsyncSocket. Wenn man mal einen Blick in die Datei sockcore.cpp wirft (Zeile 466) sieht man das dort auch ein CWnd erstellt wird. Jetzt kracht es eben an dieser Stelle.

    Ich habe zum Test eine .NET Konsolenanwendung geschrieben:

    int _tmain()
    {
    // TODO: Ersetzen Sie den Beispielcode durch Ihren eigenen Code.
    Console::WriteLine(S"Hello World");
    	if(!AfxSocketInit()) {
    		TRACE("ERROR");
    	}
    	CAsyncSocket* aSocket = new CAsyncSocket();
    	aSocket->Create(1052, SOCK_STREAM, 0);
    	aSocket->Listen(5);
    	aSocket->Close();
    	delete aSocket;
    
    	return 0;
    }
    

    Das Programm ist nicht sehr sinnvoll, zeigt aber schnell den Fehler. Wenn ich Create() aufrufe kommt der Fehler.
    Wenn ich das gleiche Programm in eine MFC Konsolenanwendung kopiere funktioniert es ohne Probleme.

    Deshalb meine Frage von oben: Wo ist der Fehler zu suche?

    credix



  • Ich habe leider noch keine Lösung gefunden. Beim debugen gibt AfxGetInstanceHandle() NULL zurück. Laut MSDN ist das allerdings ausgeschlossen. Meine Vermutung ist, dass ich die MFC nicht richtig in der .NET Konsolenanwendung initialisiere.
    Muss man die MFC in irgendeiner Form initialisieren wenn man es nicht über den Wizard bei vc++ macht? 😕

    credix



  • Manchmal stehe ich einfach auf dem Schlauch. Das Zauberwort heißt:

    AfxWinInit(::GetModuleHandle(NULL), NULL, "", 0)
    

    🙄
    schönes WE
    credix


Anmelden zum Antworten