API unter XP?



  • Mal eine Anfängerfrage: Ich habe mir mal ein Beispiel aus dem Buch von Petzold angeschaut, dabei ist mir aufgefallen, dass dort Unicode abgefangen wird.

    if (!RegisterClass (&wndclass))
    {
    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
    MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR) ;
    return 0 ;
    }
    

    Wenn man das ganze unter XP laufen lässt, erscheint die besagte Fehlermeldung. Was muss man nun ändern, umd das ganze zum laufen zu bringen?

    Gurss Thomas



  • blödsinn die fehlermeldung, so etwas ist keine vernüftige fehlerabfangung.
    vielleicht trifft das oft zu, kann ich nicht bestätigen, aber einfach dieses
    vorrauszusetzen ist falsch.

    was sagt http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/getlasterror.asp
    dazu



  • Der Petzold ist gar nicht so gut wie er immer beschrieben wird. 🤡

    Nen anderes Beispiel ist sein UpdateWindow nach ShowWindow das jetzt super viele Leute wahrscheinlich da abgeguckt haben. Total sinnlos.



  • habe ihn nicht gelesen, afaik macht das auch keinen sinn den es wird sowieso neugezeichnet 🙄



  • antipetzold schrieb:

    Der Petzold ist gar nicht so gut wie er immer beschrieben wird. 🤡

    Nen anderes Beispiel ist sein UpdateWindow nach ShowWindow das jetzt super viele Leute wahrscheinlich da abgeguckt haben. Total sinnlos.

    Wobei das afaik auch irgendeinen Sinn hatte *nachdenk ob die Sachlage den Aufwand zum Bücherregel zu gehen rechtfertigt*

    Wenn du hier unter XP einen Fehler bekommst, liegts an deiner WNDCLASS, lass die mal sehen - und verwende doch bitte WNDCLASSEX und RegisterClassEx 🙂

    MfG SideWinder



  • miller_m schrieb:

    blödsinn die fehlermeldung, so etwas ist keine vernüftige fehlerabfangung.
    vielleicht trifft das oft zu, kann ich nicht bestätigen, aber einfach dieses
    vorrauszusetzen ist falsch.
    dazu

    Er sagt selbst, dass in seinen Beispielen die Fehlerabfrage absolut minimal ist, um nicht vom Lernziel des Programms abzulenken. Seine Argumentation ist, dass Windows - sollte RegisterClass tatsächlich bei so einem Minimalbeispiel fehlschlagen - sowieso bereits den Bach runter ist. Ausnahme ist hier die Möglichkeit, dass das Programm mit UNICODE übersetzt wurde und daher unter Win <= 98 (ausser NT-Linie) wegen mangelnder Unterstützung nicht ausgeführt werden kann. Unter XP sollte das aber in der Tat funktionieren...



  • *nachdenk ob die Sachlage den Aufwand zum Bücherregel zu gehen rechtfertigt*

    lohnt sich bestimmt. geh schonmal los. 🙂



  • An welcher Stelle im Petzold steht denn das?
    Hab' kein Bock alles zu durchsuchen, dann schau ich mir das auch mal an. 🙂



  • SideWinder schrieb:

    Wenn du hier unter XP einen Fehler bekommst, liegts an deiner WNDCLASS, lass die mal sehen - und verwende doch bitte WNDCLASSEX und RegisterClassEx 🙂

    Dann liegt es wohl mindestens an den beiden.

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static WCHAR szAppName[] = "Überwachung";
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASSW    wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
          hwnd = CreateWindow (szAppName, 
         //etc
         //ect
         //etc
    
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }
    

    PS: ShowWindow() und UpdateWindow() sind nicht mit von der Partie...(da ich kein sichtbares Fenster habe) *g*

    Gruss Thomas



  • RegisterClass mit WNDCLASS nicht WNDCLASSW



  • 1. Niemals WCHAR verwenden, Unicode-Kompatibel wird man am besten mit TCHAR - so kann mans im Notfall auch noch für ASCII compilieren.
    2. Wie bereits gesagt verwende WNDCLASS und nicht WNDCLASSW (bzw. Warum nicht jeweils die EX-Version?)
    3. Wenn schon UNICODE dann bitte auch Strings als solche kennzeichnen:

    // so mit tchar:
    TEXT("String")
    
    // zumindest aber:
    L"String"
    

    MfG SideWinder



  • Oje, ich glaub, ich habe alle an der Nase rumgeführt, was "meine" Fehlermledung betrifft. Das Problem besteht darin, dass ich mit .NET arbeite, und nicht mit 6.0. Wenn ich nämlich ein neues Projekt erstelle, und den Code aus dem Beispiel von Petzold reinkopiere, läuft es...
    Ganz fettes Sorry!!
    Thomas


Anmelden zum Antworten