Visual C++ 2005 Problem bei der WinAPi



  • Halle alle,

    ich habe mir ein Buch über die WinApi gekauft nun habe ich volgendes Problem.
    ich benutze den Dev-C++ Compiler

    nun ich wollte eine einfache wavedatei in einen Projekt abspielen lassen.
    aber nun heist es buil error. Ich benutze hier ein Standart des Compilers und habe die Stelle mit PlaySound() ergänzt hier der code

    #include <windows.h>
    #include <mmsystem.h>

    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain (HINSTANCE hThisInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpszArgument,
    int nFunsterStil)

    {
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);

    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;

    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if (!RegisterClassEx (&wincl))
    return 0;

    hwnd = CreateWindowEx (
    0,
    szClassName,
    "Windows App",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    544,
    375,
    HWND_DESKTOP,
    NULL,
    hThisInstance,
    NULL
    );

    ShowWindow (hwnd, nFunsterStil);

    while (GetMessage (&messages, NULL, 0, 0))
    {

    TranslateMessage(&messages);

    DispatchMessage(&messages);
    }

    return messages.wParam;
    }

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    //hier beginnt mein Problem
    ::PlaySound("E:\\Zaynordner\\HolyZayns Bereich\\Programme\\WinApi\\Chap03\\HelloWin\\HelloWin.wav", NULL, SND_FILENAME | SND_ASYNC );
    switch (message)
    {
    case WM_DESTROY:
    PostQuitMessage (0);
    break;
    default:
    return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
    }

    könnt ihr mir sagen was ich flsch mach 🙂

    danke



  • Zayn schrieb:

    ich habe mir ein Buch über die WinApi gekauft nun habe ich volgendes Problem.

    Du bist hier falsch! Schau mal 4 Foren darüber -> WinAPI Forum...

    Aber ich bin mal nicht so, also:

    Magst du uns verraten, was ein

    Zayn schrieb:

    stan**** des Compilers

    sein soll?

    Bitte benutze cpp-Tags!

    dein Code:

    #include <windows.h>
    #include <mmsystem.h>
    
    LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );
    
    char szClassName[ ] = "WindowsApp";
    
    int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil )
    {
        HWND hwnd;
        MSG messages;
        WNDCLASSEX wincl;
    
        wincl.hInstance      = hThisInstance;
        wincl.lpszClassName  = szClassName;
        wincl.lpfnWndProc    = WindowProcedure;
        wincl.style          = CS_DBLCLKS;
        wincl.cbSize         = sizeof (WNDCLASSEX);
        wincl.hIcon          = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm        = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor        = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName   = NULL;
        wincl.cbClsExtra     = 0;
        wincl.cbWndExtra     = 0;
    
    //  wincl.hbrBackground  = (HBRUSH) COLOR_BACKGROUND;
    //  ^ MSDN: A color value must be one of the following standard system
    //          colors (the value 1 must be added to the chosen color).
    //  also:
    
        wincl.hbrBackground  = (HBRUSH) COLOR_BACKGROUND + 1;
    
        if( !RegisterClassEx( &wincl ) )
            return 0;
    
        hwnd = CreateWindowEx(
            0,
            szClassName,
            "Windows App",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            544,
            375,
            0,                      // HWND_DESKTOP ist hier Humbug.
            0,
            hThisInstance,
            0
        );
    
        UpdateWindow( hwnd );              // bitte auch updaten.
        ShowWindow( hwnd, nFunsterStil );
    
    //  while( GetMessage( &messages, NULL, 0, 0 ) ) {
    //  ^ du willst doch sicher nur meldungen, welche an dein Fenster
    //    gerichtet sind!?
    
        while( GetMessage( &messages, hwnd, 0, 0 ) ) {
            TranslateMessage( &messages );
            DispatchMessage( &messages );
        }
    
        return messages.wParam;
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        // hier beginnt mein Problem
    //  ::PlaySound(
    //      "E:\\Zaynordner\\HolyZayns Bereich\\Programme\\WinApi\\Chap03\\HelloWin\\HelloWin.wav",
    //      NULL,
    //      SND_FILENAME | SND_ASYNC 
    //  );
    //  ^ du willst doch nicht jedes mal, wenn dein Fenster eine Message bekommt das wave-File
    //    abspielen!? also:
    
        static HWND button = 0;
        const int id_button = 300;
    
        switch( message ) {
    	case WM_CREATE:
                button = CreateWindow(
                    "BUTTON",
                    "Play!",
                    WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                    10,
                    10,
                    100,
                    100, 
                    hwnd,
                    reinterpret_cast< HMENU > ( id_button ),
                    reinterpret_cast< HINSTANCE >( GetWindowLong( hwnd, GWL_HINSTANCE ) ),
                    0
                );
                return 0;
    
            case WM_COMMAND:
                switch( LOWORD( wParam ) ) {
                    case id_button:
                        PlaySound(
                            "E:\\Zaynordner\\HolyZayns Bereich\\Programme\\WinApi\\Chap03\\HelloWin\\HelloWin.wav",
                            0,
                            SND_ASYNC | SND_FILENAME
                        );
                        return 0;
                }
                break;
    
            case WM_CLOSE:
                PostQuitMessage( 0 );
                return 0;
        }  
    
        return static_cast< long >( DefWindowProc( hwnd, message, wParam, lParam ) );
    }
    

    Zayn schrieb:

    könnt ihr mir sagen was ich flsch mach 🙂

    Ja, has müsst heißen: könnt ihr mir sagen**,** was ich falsch mache? 😃

    Ne, im ernst: Du hast vergessen, gegen die winmm.lib zu linken.

    Greetz, Swordfish

    [edit of edit]Verdammt, ich glaub' ich geb's Programmieren jetzt dann auf...[/edit of edit]



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich glaub ich habe vergessen zu sagen das ich noch ein änfanger bin. Naja ich versteh nur nicht des mit dem "gegen die winmm.lib zu linken" den rest müsste ich eigentlich verstehen.
    Könntest mir des ein bischen näher erklären weil in meinem Buch des vorrausgesetzt wird.

    danke für antwort ^^



  • Zayn schrieb:

    Ich glaub ich habe vergessen zu sagen das ich noch ein änfanger bin. Naja ich versteh nur nicht des mit dem "gegen die winmm.lib zu linken" den rest müsste ich eigentlich verstehen.
    Könntest mir des ein bischen näher erklären weil in meinem Buch des vorrausgesetzt wird.

    gegen die winmm.lib linken heißt das du die Bibiothek WinMM.lib in dein Projekt mit einbindest, bzw diese dem Linker 'übergibst' (der Linker bindet diese dann s. zu s. mit ein):

    Das geht auf 2 Arten:

    1.: Über die Projekteinstellungen:

    Projekt -> Einstellungen -> Linker...
    unter "Objekt-/Bibiothek-Module:" ans Ende scrollen und " WinMM.lib" anhängen! -Fertig!

    2.: im Programmcode:

    einfach nach deinen Includes folgende Compileranweisung einsetzen:

    #pragma comment(lib, "WinMM.lib")
    


  • Jep des habe ich auch schon versucht aber wenn ich das Programm komplieiren will kommt diese Fehlermeldung

    D:\Dokumente und Einstellungen\Zayn\Desktop\Makefile.win [Build Error] [Projekt1.exe] Error 1



  • Ähm, welche IDE bzw. Compiler? CodeFinder's Vorschlag war für Microsoft Visual Studio.

    Greetz, Swordfish



  • Swordfish schrieb:

    CodeFinder's Vorschlag war für Microsoft Visual Studio.

    jop sry, vergessen zu sagen... dann hasse vllt. n anderen Compiler...?



  • Bloodshed devc++ Compiler wieso?



  • Zayn schrieb:

    Bloodshed devc++ Compiler wieso?

    Wieso!!!??? Arrrgghhhh *mir die Zähne an der Tischkante ausbeiß und mir auf den Kopf hau*

    Weil dir dann alle möglichen Ratschläge eine .lib in Microsoft Visual Studio einzubinden logischerweise nicht helfen werden!
    Schau in die Hilfe deiner IDE!!!

    Greetz, Swordfish

    BTW: Bloodshed DevC ist kein Compiler sondern eine IDE und benutzt IMHO den MinGW-Compiler



  • 😞 konnt ich doch nicht wissen sry! aber jetzt weis ich wenigsten was ich falsch gemacht habe wie dumm von mir naja ich such mir nen neuen Compiler mit dem ich das machen kann dankeschön. 🙂 jetzt kann i weiter machen.

    Könntet ihr mir einen empfehlen.

    Irgenwie is ma des jetzt peinlich 😮



  • Zayn schrieb:

    naja ich such mir nen neuen Compiler mit dem ich das machen kann [...]

    Ich sagte nicht, daß es mit DevC nicht möglich sei!! Bitte ließ, was dasteht! Es ist definitiv möglich, nur weiß ich - in Ermangelung dieses Prunkstücks an Software - nicht worauf du in welcher Reihenfolge klicken musst, wesshalb ich dir geraten habe in die Hilfedatei von DevC zu schaun.

    Greetz, Swordfish



  • oki docki i schau mal nach ^^



  • Wobei du sicherlich nciht schlecht geraten wärst anstelle dessen dir mal die Mircrosoft Visual C++ 2005 Express Edition IDE anzugucken...



  • ...ist afaik umsonst. 🙂



  • Ok ich komm mit der Hilfestellung von dem dev c++ compiler zurecht.

    Ich habe mir mal den Mircrosoft Visual C++ 2005 Express Edition IDE runtergeladen aber mit dem komm ich überhaupt nicht klar, den wenn ich den code ausführen will kommen nur Fehler aber ich versteh nicht warum die meldung kommt

    Error 1 fatal error C1083: Cannot open include file: 'windows.h': No such file or directory e:\zaynordner\holyzayns bereich\tests\f\Form1.h 6

    😡 irgendwie bin ich blöd oda!



  • siehe in diesem Post (Wie kann man sowas eigentlich 'übersehen' 😕 ?!)
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-143003.html

    speziell hier (!!!): 😃
    Wenn Du WinAPI machen willst (deswegen bist Du ja hier), dann benötigst Du noch das PSDK:
    http://www.microsoft.com/downloads/details.aspx?familyid=D8EECD75-1FC4-49E5-BC66-9DA2B03D9B92&displaylang=en (395 MB)

    😉



  • Mal eine ernstgemeinte Frage eines C Programmierers: Was bringen diese ellenlangen potthässlichen reinterpret_cast<> statements und deren ganzen ähnlichen varianten. Kann man damit was besseres machen als mit einem normalen C-cast der 3 mal kompakter aussieht und auch nur 3 mal so wenig schreibarbeit und platz wegnimmt?



  • C Casts in C++ sind einfach nochmal deutlich unsicherer, als Casts ohnehin schon sind. Bsp.:

    // c cast
    const char* a = "Hallo";
    char* b = (char*) a;
    b[1] = 'e'; // ooops
    
    // c++ cast
    const char* a = "Hallo";
    char* b = reinterpret_cast<char*>(a); // Compilerfehler, da const nicht einfach weggecastet werden kann
    b[1] = 'e';
    

    Und dass diese C++ Casts so "hässlich" aussehen und in ihrer Anwendung sind, hat einfach den Grund, dass man sie so möglichst meidet. Was generell in guter Vorsatz für Casts ist. Leider glauben einige Leute, dass es deshalb "schöner" ist, stattdessen einfach C Casts zu benutzen. Allerdings ist das ein Irrglaube.



  • Hmm also ich find das:

    // c++ cast
    const char* a = "Hallo";
    char* b = reinterpret_cast<char*>(a); // Compilerfehler, da const nicht einfach weggecastet werden kann
    b[1] = 'e';
    

    sieht wesentlich eleganter aus als das:

    // c cast
    const char* a = "Hallo";
    char* b = (char*) a;
    b[1] = 'e'; // ooops
    

    Is nu n bissl mehr zu tippen :p

    mal so btw :p


Anmelden zum Antworten