Problem mit erstem WindowsFensterProgramm/ Can not find or open the PDB file

silent12

Mitglied
Hallo
habe gerade versucht mein erstes C++ Programm zu erstellen, dass in einem Windows-Fenster läuft (besser gesagt einfach das Fenster), aber ich bekomme immer unten die Fehlermeldung (mit Visual Studio C++) Cannot find or open the PDB file.
Kann mir jemand helfen ?
Hier der Code:
Code:
// main_cpp //

#include <Windows.h>
#include <iostream>

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
const char szClassName[] =  "Hallo";
	  char szTitle[] = "1.ProgrammGrafics3 Silent1297 2011 ©";




int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
		   LPSTR szCmdLine, int iCmdShow)

	{
		WNDCLASSEX WndClassEx;
		HWND hWnd;
		MSG msg;
		WPARAM	wParam;
		LPARAM  lParam;
		UINT umsg;
		

		//          Registrierung           //

		WndClassEx.cbSize      = sizeof( WndClassEx);
		WndClassEx.style       = CS_NOCLOSE;
		WndClassEx.lpfnWndProc = (WNDPROC)WndProc;
		WndClassEx.cbClsExtra  = NULL;
		WndClassEx.cbWndExtra  = NULL;
		WndClassEx.hInstance   = hInstance;
		WndClassEx.hIcon	   = NULL;
		WndClassEx.hCursor	   = NULL;
		WndClassEx.hbrBackground = (HBRUSH) (COLOR_BACKGROUND +1);	
		WndClassEx.lpszMenuName = NULL;
		WndClassEx.lpszClassName = szClassName;	// C-String
		WndClassEx.hIconSm      =  NULL;

		RegisterClassEx ( &WndClassEx );


		//          Fenster Erstellen          //

		hWnd = CreateWindowEx (WS_EX_CLIENTEDGE,
						szClassName, 
						szTitle,
						WS_OVERLAPPEDWINDOW,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						NULL,
						NULL,
						hInstance,
						NULL);

		while( GetMessage ( &msg, hWnd, NULL, NULL) > NULL)
			{
				TranslateMessage( &msg );
				DispatchMessage ( &msg );
			};

	ShowWindow( hWnd, iCmdShow);
		
				
		// WINDOW-PROCEDUR -> WNDCLASSEX -> HWND -> MESSAGELOOP


		return 0;
	}

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
			{
				switch (msg)
					{
						case WM_QUIT:		//Programm Ende
							{
							MessageBox ( NULL,"Programm wurde beendet",
										"Programm End", MB_OK);
							DestroyWindow( hWnd);
							}
							break;

						case WM_DESTROY:		//Fenster Ende

							PostQuitMessage(0);
							break;

						default:
							return DefWindowProc ( hWnd, msg, wParam, lParam);
					}
			};

Würde mich sehr über Hilfen freuen
silent12
 
Hi.

Wie lautet die Fehlermeldung genau?

Die .pdb Datei brauchst du nur zum Debuggen. Welche Build-Konfiguration verwendest du (Debug oder Release)? Wie startest du die Anwendung? Versuch mal Strg+F5.

Gruß
 
Also, mit der Fehlermeldung an sich kann ich nicht viel anfangen, weil ich nicht in Visual Studio programmiere. Aber was mir aufgefallen ist, du deklarierst 2x wParam und lParam. Einmal in der Funktion WndProc und dann noch in deinem WinMain. Die Varriable UINT umsg ist mir auch nicht ganz klar. Ich erstelle meine Fenster mit dieser Vorlage:

C++:
LRESULT CALLBACK MainProc(HWND, UINT, WPARAM, LPARAM);  //Hauptfenster

const char szMainname[] = "Hauptfenster";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    MSG msg;

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = MainProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(ID_MYICON));
    wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
    wc.lpszClassName = szMainname;
    wc.lpszMenuName  = NULL;

    RegisterClass(&wc);

    hWnd = CreateWindow(szMainname,
                        szMainname,
                        WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX,
                        GetSystemMetrics(SM_CXSCREEN) / 2 - iWindowX / 2,
                        GetSystemMetrics(SM_CYSCREEN) / 2 - iWindowY / 2,
                        iWindowX,
                        iWindowY,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK MainProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_CREATE:
        {
            //Hier kommen deine Child-Fenster rein

            return 0;
        }

        case WM_SIZE:
        {
            rect.right  = LOWORD(lParam);
            rect.bottom = HIWORD(lParam);

            //Hier plazierst du deine Child-Fenster

            InvalidateRect(hWnd, NULL, FALSE);

            return 0;
        }

        case WM_CLOSE:
        {
            //Eventuell eine MSG-Box

            DestroyWindow(hWnd);

            return 0;
        }

        case WM_DESTROY:
        {
            PostQuitMessage(0);

            return 0;
        }
    }

    return DefWindowProc(hWnd, message, wParam, lParam);
}

grüße
 
Danke für das Grundgerüstbeispiel, aber bei mir werden dabei mehrere Fehler angezeigt (zB Windowx o.ä.)
Meine Fehlermeldung sieht so aus:

"grafic3.exe": "C:\Users\silent12\Documents\#C++\_grafic3\Debug\grafic3.exe" geladen, Symbole wurden geladen.
"grafic3.exe": "C:\Windows\SysWOW64\ntdll.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\kernel32.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\KernelBase.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\user32.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\gdi32.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\lpk.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\usp10.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\msvcrt.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\advapi32.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\sechost.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\rpcrt4.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\sspicli.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\cryptbase.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\msvcr100d.dll" geladen, Symbole wurden geladen.
"grafic3.exe": "C:\Windows\SysWOW64\imm32.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\msctf.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\uxtheme.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Program Files (x86)\RocketDock\RocketDock.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"grafic3.exe": "C:\Windows\SysWOW64\psapi.dll" geladen, Cannot find or open the PDB file
"grafic3.exe": "C:\Windows\SysWOW64\dwmapi.dll" geladen, Cannot find or open the PDB file


Bei grafic3.exe handelt es sich um meine Datei.
Mit Strg + F5 geht's auch nicht :/
Trotzdem danke für die Antworten
 
Das sieht mir stark danach aus, dass das Programm schon läuft. Habe ich recht?

Versuch's mal so: Visual Studio (2010?, Express?) öffnen. Neues Projekt->Win32 (nicht die Konsolenanwendung) und erstellen.
Drück dann mal F5. Funktioniert das?

cwriter
 
Dein Program läuft, aber das Fenster ist nicht sichtbar.

Ein paar Fehler:

1) Deine WndProc gibt für WM_QUIT und WM_DESTROY keinen return-Wert zurück.

2) return DefWindowProc im default-Switch ist eine schlechte Idee. Bei fast allen Messages mußt du auch nach deiner Behandlung die Nachricht an DefWindowProc weiterreichen. Am besten return DefWindowProc NACH dem switch/case einsetzen.

3)Deine Hauptschleife ist falsch. Gib bei GetMessage NULL als HWND an, sonst erhältst du WM_QUIT nicht (WM_QUIT ist eine Thread-Nachricht, keine Windows-Nachricht)

3b) WM_QUIT wirst du in der WindowProc nie erhalten. Das PostQuitMessage auf WM_DESTROY hin ist sauber, aber den WM_QUIT-Teil kannst du dir schenken. Wenn GetMessage auf WM_QUIT trifft, wird deine Hauptschleife automatisch verlassen.
Der Inhalt von deinem WM_QUIT-Handler sieht aber so aus, als sollte er eigentlich auf WM_CLOSE reagieren (dann wäre DestroyWindow da auch richtig).

4) Dein Fenster ist da, aber du hast es zu spät sichtbar gemacht (Dein ShowWindow-Aufruf steht hinter der Hauptschleife).
Setze es vor die Hauptschleife (nach CreateWindowEx) oder erstelle das Fenster gleich mit Style WS_VISIBLE:

WS_OVERLAPPEDWINDOW | WS_VISIBLE

5) Das Semikolon nach WndProc brauchst du nicht.

6) Warum hast du denn CS_NOCLOSE bei der Klasse angegeben? So lässt sich dein Fenster im Moment nicht wirklich beenden.

7) Du hast bei der Klasse keinen Cursor angegeben, daher wird auch keiner gesetzt. Man erhält entweder die Sanduhr oder den Cursor, der grade aktiv war.
 
Danke genau sowas habe ich jetzt für den Anfang gebraucht. Werde morgen früh oder heute abend die Dinge ändern.
Das mit NOCLOSE war beabsichtigt als Test (über den Task-Manager geht das Schließen ja noch).
Personen wie du erhalten Foren am Leben.
 
Danke für die Antwort, nur bekomme ich immernoch als Fehlermeldung:


>c:\users\silent12\documents\#c++\_grafic3\grafic3\main.cpp(22): warning C4101: 'umsg': Unreferenzierte lokale Variable
1>c:\users\silent12\documents\#c++\_grafic3\grafic3\main.cpp(21): warning C4101: 'lParam': Unreferenzierte lokale Variable
1>c:\users\silent12\documents\#c++\_grafic3\grafic3\main.cpp(20): warning C4101: 'wParam': Unreferenzierte lokale Variable

Weiß dazu jemand etwas ?
 
Hi.

Die Warnung ist doch eigentlich ziemlich eindeutig, oder?!

Die Funktion bekommt einige Parameter übergeben bzw. enthält von dir definierte Variablen, die du überhaupt nicht benutzt.

Diese Warnung kannst du getrost ignorieren. Die unbenutzte Variable kannst du natürlich auch einfach löschen.

Gruß
 
Zurück