Forum: PC-Programmierung Fehler unter VC6++ mit Aufruf von WndProc


von Knuddel P. (knopf)


Lesenswert?

Hallo ich arbeite mich gerade in MFC durch.
Ich bin aber noch im Anfang aller Dinge und habe ein Problem bei WndProc 
unter Windows XP. Ich ahbe das Bespiel von Ihnen kopiert und erhalte 
Fehlermeldungen bei dem Systemaufruf von WnProc bei der Kompilierung. In 
der Onlinehilfe ist die Funktion aber bennant und auch richtig.

Können Sie mir einen Tipp geben?

// FirstWin.cpp : Definiert den Einsprungpunkt für die Anwendung.
//

#include "stdafx.h"

// Konstanten
// ----------
// Fensterklassen-Name
LPCTSTR lpszWCLASSNAME = "ERSTES FENSTER";

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,
                     int nCmdShow )
{
    // ZU ERLEDIGEN: Fügen Sie hier den Code ein.

    // Fensterklasse registrieren
    // --------------------------
    // WNDCLASS-Strukur
    WNDCLASSEX WndClass;
    // Struktur mit '0' vorbelegen
    memset(&WndClass,0,sizeof(WndClass));
    WndClass.cbSize = sizeof(WndClass);
    // Fensterprozedur einhaengen
    WndClass.lpfnWndProc = WndProc;
    // Instanzen-Handle
    WndClass.hInstance = hInstance;
    // Icon fuer Fensterklasse laden
    WndClass.hIcon = LoadIcon(0,IDI_WINLOGO);
    // Cursor fuer Fensterklasse laden
    WndClass.hCursor = LoadCursor(0,IDC_UPARROW);
    // Fensterhintergrund setzen
    WndClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    // Fensterklassen-Name
    WndClass.lpszClassName = lpszWCLASSNAME;
    // Fensterklasse registrieren
    RegisterClassEx(&WndClass);

    return 0;
}
Kompilierung läuft...
FirstWin.cpp
C:\VISUAL-C-WORK\FirstWin\FirstWin.cpp(23) : error C2065: 'WndProc' : 
nichtdeklarierter Bezeichner
C:\VISUAL-C-WORK\FirstWin\FirstWin.cpp(23) : error C2440: '=' : 'int' 
kann nicht in 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned 
int,long)' konvertiert werden
        Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp 
erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- 
oder Funktionsformat
Fehler beim Ausführen von cl.exe.

FirstWin.exe - 2 Fehler, 0 Warnung(en)

von Karl H. (kbuchegg)


Lesenswert?

WndProc ist der traditionelle Name der Funktion, die an die Windows 
Message Loop angehängt wird und Messages bearbeitet. Und nein, diese 
Funktion müsstes du selber schreiben.

Aber sag: Was um alles in der Welt machst du da?
Es kommt zwar vor, das man mit der MFC an solche Internals ran muss, 
aber ganz sicher nicht am 'Anfang aller Dinge'. Das ist hardcore Windows 
C-API Programmierung und eigentlich sollte einen die MFC genau davor 
schützen, sich mit solchen Dingen rumschlagen zu müssen. (Das tut sie 
auch. Manchmal mehr schlecht als recht, aber sie tut es)

von Knuddel P. (knopf)


Lesenswert?

Ich habe im Internet ein Tutorial gefunden. Das ist eigentlich ganz gut 
gemacht. Aber Beim Compilieren stoße ich an diese Fehlermeldung.
Bei diesem Tutorium geht es darum zu verstehen was MFC macht und wie 
Fenster behandelt werden. Hintergrund ist, dass man dann auch mal 
versteht was der Assistent da hinzaubert falls es mal klemmt.

Und ein Beispiel wurde gemacht um zu zeigen wie man Fenster aufbaut.

www.cpp-tutor.de

von marais (Gast)


Lesenswert?

Ich sehe es wie Karl-Heinz: Für den Einstieg in die MFC ist das, was Du 
Dir da antust, absolut nicht zweckdienlich. Erst sehr viel später, wenn 
Du mal irgendwo an eine Grenze stösst, mag ein Eingriff unter der 
Motorhaube sinnvoll sein. Die MFC sind doch dazu da, den ganzen 
Windows-Unterbau zu kapseln. Was Du da machst, erinnert mich stark an 
mein erstes Buch zum SDK von Windows 2.11 von Charles Petzold. Nö nö.

von Marcus F. (gizzmo)


Lesenswert?

Grundsätzlich finde ich es eine gute Idee, wenn man auch mal schaut was 
"hinter den Kulissen" passiert, aber für die ersten Schritte ist das 
sicherlich noch nicht angemessen.
Die MFC ist relativ komplex und SW technisch gesehen nicht unbedingt 
das, was ich ein sauberes und übersichtliches Design nennen würde. Mit 
anderen Worten das Wissen um die MFC Internas fördern nicht das 
grundsätzliche Verständnis der MFC.
In der MSDN findest Du reichlich Material zur MFC Verwendung (damit 
würde ich beginnen) und (für danach) Details über den Aufbau und die 
Internas.

Warum verwendest Du überhaupt die MFC? Gibt es einen besonderen Grund 
dafür? Zur Erstellung einer Windows Applikation greife ich heute nur 
noch dann auf die MFC zurück, wenn es sich überhaupt nicht vermeiden 
läßt, d.h. es gibt zwingende Gründe dafür.
Mittlerweile gibt es deutlich effizientere Möglichkeiten Windows 
Applikationen zu entwickeln: .NET (in C++ oder C#, ggf. VB) oder Swing / 
AWT (Java), "höhere" Skriptsprachen wie Python oder Ruby.

Die Wahl der Umgebung hängt natürlich vom zu lösenden Problem ab.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die von Dir erwähnten Alternativen sind allesamt nicht mit C++ 
programmierbar, auch das .Net-Geraffel nicht. Was sich da C++ 
schimpft, ist tatsächlich "managed C++", und das hat mit C++ nicht mehr 
sonderlich viel gemein.

Es gibt hinreichend ausdiskutierte Gründe, keine zig MB große 
Laufzeitumgebung zu verwenden, und die MFC als "echte" 
C++-Klassenbibliothek erlaubt es, statisch gelinkte Anwendungen zu 
produzieren, ohne Abhängigkeiten von der "DLL-Hölle" und ohne 
Abhängigkeiten von irgendeiner CLR. Andere Programmiersprachen, 
Skriptsprachen gar, sind in manchen Fällen erst recht keine Alternative.

Viel MFC-Bashing bezieht sich auf die zu Recht als veraltet zu 
bezeichnende Version, die mit VC6 verwendet wurde -- die mit VC9 
("Visual Studio 2008") verwendete MFC-Variante ist aber inhaltlich 
massiv überarbeitet worden und setzt auch einige C++-Konstrukte ein, die 
VC6 aufgrund des recht lausigen Compilers nicht unterstützte.

Alternativen zur MFC, die ebenfalls mit C++ programmiert werden können, 
wären Qt und wxWidgets, beide bieten den Vorteil einer gewissen 
Plattformunabhängigkeit (damit lassen sich auch Anwendungen für *nix und 
Mac OS X erzeugen).

Für MFC-Erfahrene bietet wxWidgets den Vorteil einer gewissen 
strukturellen Ähnlichkeit, d.h. manche Konzepte sind sich sehr ähnlich. 
Im Gegensatz zur sehr auf eine ganz spezifische Vorgehensweise 
ausgerichteten MFC bietet wxWidgets dann aber im Detail mehr 
Freiheitsgrade.

Für Leute, die erst jetzt damit anfangen, ist ein solches 
plattformübergreifend einzusetzendes Werkzeug sicherlich sinnvoller als 
eine Bindung an Windows, die mit der MFC einhergeht.

<Pedanterie>
interna ist bereits ein Plural.

von Karl H. (kbuchegg)


Lesenswert?

Ich benutzte die MFC eigentlich immer noch gerne.
Dafür gibt es 2 Gründe:
Zum einen, wie Rufus schon angesprochen hat, kann ich alles statisch 
linken. Ich seh einfach nicht ein, warum ich ein 40MB Framework auf 
einer Maschine haben soll, wenn ich das Ganze mit der MFC statisch 
gelinkt unter 1 MB haben kann. Ich hab hier viele derartige Exe von 
Programmen, die vor Jahren geschrieben wurden. CD raus ... EXE gestartet 
... läuft. Keine Probleme mit Versionschaos oder sonstigen notwendigen 
Updates. Und im Vergleich zu dem .Net Geraffel startet das Exe in 
Windeseile.

Zum anderen schätze ich die Document/View Architektur, die einem die MFC 
mehr oder weniger aufzwingt und die sehr gut funktioniert. Ich hab hier 
ein Qt Programm übernommen und ich wünschte der Autor hätte vorher ein 
paar Jahre lang mit der MFC den Document/View Gedanken verinnerlicht 
bzw. sich angesehen wie die Aufgabenverteilung bei Dialogen sinnvoll 
gemacht werden kann.

Nachteilig bei der MFC ist für mich lediglich, dass man bei moderneren 
GUI Konstrukten im Regen steht, sofern man keine Fremdlibraries dafür 
hat bzw. sich im Fundus nichts passendes findet. Auch mit dem OCX/Active 
X Zeugs konnte ich mich über die Jahre hinweg dann doch noch anfreunden. 
Anfangs (~1996, 97) gabs damit eigentlich immer nur massiven Ärger. VOn 
100 Kunden waren immer 2 oder 3 dabei, bei denen sich OCX-Controls nicht 
richtig registrieren liessen.

von Marcus F. (gizzmo)


Lesenswert?

Rufus t. Firefly wrote:
> Die von Dir erwähnten Alternativen sind allesamt nicht mit C++
> programmierbar, auch das .Net-Geraffel nicht. Was sich da C++
> schimpft, ist tatsächlich "managed C++", und das hat mit C++ nicht mehr
> sonderlich viel gemein.
>
> Es gibt hinreichend ausdiskutierte Gründe, keine zig MB große
> Laufzeitumgebung zu verwenden, und die MFC als "echte"
> C++-Klassenbibliothek erlaubt es, statisch gelinkte Anwendungen zu
> produzieren, ohne Abhängigkeiten von der "DLL-Hölle" und ohne
> Abhängigkeiten von irgendeiner CLR. Andere Programmiersprachen,
> Skriptsprachen gar, sind in manchen Fällen erst recht keine Alternative.
>
> Viel MFC-Bashing bezieht sich auf die zu Recht als veraltet zu
> bezeichnende Version, die mit VC6 verwendet wurde -- die mit VC9
> ("Visual Studio 2008") verwendete MFC-Variante ist aber inhaltlich
> massiv überarbeitet worden und setzt auch einige C++-Konstrukte ein, die
> VC6 aufgrund des recht lausigen Compilers nicht unterstützte.
>

Wer jetzt hier Bashing betreibt sei mal dahin gestellt...
Das Tools muss halt zum Problem passen, das war mein Punkt. Was Du da 
rein interpretierst sei Dir überlassen.

>
> <Pedanterie>
> interna ist bereits ein Plural.

Wenn es Dir hilft.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.