Problem mit WinAPI



  • Hallo ich habe ein Problem mit WinAPI,
    Ich kann keine " " setzen da diese sofrt als falsch markiert werden...
    Die begründung Lautet bei z.B. diesem befehl:
    wc.lpszClassName = "Login"; unter dem = wird angegeben:
    Ein Typ vom ""const char*"" kann einer Entität vom Typ ""LPCSTR"" nicht zugewiesen werden.
    Kann mir da wer helfen?



  • Probier mal L"Login".



  • Okay funktioniert vielen Dank!



  • Ich staune:

    LPCSTR:
    Ein Zeiger auf eine Konstante mit NULL endende Zeichenfolge von 8-Bit-Windows-Zeichen (ANSI) 🤔



  • @Belli sagte in Problem mit WinAPI:

    Ich staune:

    LPCSTR:
    Ein Zeiger auf eine Konstante mit NULL endende Zeichenfolge von 8-Bit-Windows-Zeichen (ANSI) 🤔

    Besonders wichtig ist hier zu wissen, dass es sich um einen Long Pointer handelt. Der ist ansonsten leicht mit einem Near Pointer zu verwechseln, mit dem dein 16-Bit-Prozessor nur innerhalb des selben 64KiB-Speichersegments adressieren kann.

    Die WinAPI ist ein schönes Beispiel dafür, wie sich die Ungarische Notation selbst überlebt 😉



  • Auf jeden Fall ist es ein Zeiger auf const char - deshalb staune ich darüber, dass man ihn mit, wie oben gesagt, L"Login" initialisieren kann ...



  • @Belli Entweder @Lucas188 lügt oder sein Compiler. Für mich ist die Sachlage klar ^^



  • Also ich habe keine Ahnung was da los is... Ich habe erst vor einer Woche mit C++ angefangen..



  • Ich schätze, Du hast uns in Deiner Fehlermeldung
    'Ein Typ vom ""const char*"" kann einer Entität vom Typ ""LPCSTR"" nicht zugewiesen werden.'
    ein 'W' unterschlagen:
    'Ein Typ vom ""const char*"" kann einer Entität vom Typ ""LPCWSTR"" nicht zugewiesen werden.'



  • Okay bei mir ist noch was passirt ich hab jz zwar alles fertig aber das Fenster geht immer noch nich auf dafür aber kommt diese Fehler meldung:
    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion ""int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)".
    Auch kann ich das Problem ort nich öffnen

    #include <Windows.h>
    #include <cassert>
    
    LRESULT CALLBACK MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    	switch(uMsg) {
    	case WM_CLOSE:
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    
    	WNDCLASS wc;
    	HWND hWnd;
    	MSG msg;
    
    	wc = {};
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc = MessageHandler;
    	wc.hInstance = hInstance;
    	wc.lpszClassName = L"Login";
    
    	assert(RegisterClass(&wc));
    
    	hWnd = CreateWindow(L"Login", L"Login", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, 0, 0, hInstance, 0);
    
    	ShowWindow(hWnd, nCmdShow);
    	SetForegroundWindow(hWnd);
    	SetFocus(hWnd);
    	UpdateWindow(hWnd);
    	
    	while (true) {
    		BOOL result = GetMessage(&msg, 0, 0, 0);
    		if (result > 0) {
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    		else {
    			return result;
    		}
    	}
    }
    


  • @Belli Oh stimmt tschuldige.



  • @Lukas188 sagte in Problem mit WinAPI:

    Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion ""int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)".

    Du musst Deinem Linker sagen, dass Du ein Windows-Programm - im Gegensatz zu einem Konsolenprogramm - haben willst. Letzteres hat eine main-Funktion als Einsprungpunkt, ersteres eine WinMain:
    https://docs.microsoft.com/de-de/cpp/build/reference/subsystem-specify-subsystem?view=msvc-160



  • @Lukas188 sagte in Problem mit WinAPI:

    Also ich habe keine Ahnung was da los is... Ich habe erst vor einer Woche mit C++ angefangen..

    Du hast erst angefangen und programmierst die WinAPI? Das nenne ich ambitioniert. 👍

    Die WinAPI ist in C programmiert, nutzt einige spezielle C Techniken und ist nicht gerade Typ sicher. Es bedarf einiger Zeit und einiger Motivation die WinApi zu erlernen.

    Die WinAPI nutzt eine Reihe von Prefixes welche man kennen muss.

    Ebenso sollte man die Unicode/ASCII Stringverwaltung kennen.

    Wenn du diese kennst, kannst du bei unbekanntem Befehlen wie beispielsweise _stprintf_l die Grundlagen der Funktion erkennen.



  • @Lukas188 sagte in Problem mit WinAPI:

    assert(RegisterClass(&wc))

    Entferne mal bitte hier den assert Befehl.

    Im Debug Modus funktioniert dies zwar, im Release Modus aber nicht, da der Ausdruck RegisterClass() nicht ausgewertet wird.



  • Öhm Funktioniert alles allerdings nur mit asset



  • Ohne assert wird das Fenster nicht angezeigt



  • Du sollst nicht die ganze Zeile löschen sondern ersetzen:

    RegisterClass(&wc);
    

    oder besser

    if (!RegisterClass(&wc)) {
        MessageBoxA(nullptr, "Failed to register window class!", "Error:", MB_OK);
        return 0;
    }
    


  • Okay danke schön jetzt funktioniert alles


Log in to reply