Merkwürdiges Verhalten von Animate_Play();



  • Hi Leute

    Ihr habt mir schonmal so toll geholfen, da dacht ich mir, diesmal kriegt ihr das auch hin. Also folgendes: ich lade ein kleines Avi von der Platte mit:

    video = Animate_Create(hwnd,502,WS_CHILD| WS_VISIBLE,hInst); 
            Animate_Open(video,"test.avi");
    

    Das funktioniert auch einwandfrei.

    Jetzt muss ich natürlich noch

    Animate_Play(video,0,-1,-1);
    

    aufrufen, damit die Animation beginnt.

    Tja, und nu kommst: Geht nicht. Wo Animate_play() aufgerufen wird, ist so ziemlich egal, das Programm stürzt jedes mal mit nem Speicherlesefehler ab.
    GetLastError() geht auch nicht, das Programm verabschiedet sich schon vorher.
    Das komische ist, dass das kleine Avi tatsächlich wiedergegeben wird, auch in der Endlosschleife (bis man halt den Fehlerdialog beendet) Habs auch mit clock.avi probiert --> gleicher Effekt.

    Animate_Play(video,0,0,0);
    

    Das geht komischer Weise, aber nich sehr sinnvoll. 😃
    Hab mich schon durch alle Foren im Inet gewühlt, sogar auf Russisch und Japanisch, aber nichts gefunden. Ich hatte sowas ja sogar schonmal am Laufen, hatte es dann wieder raus, und hab mich nun doch umendschieden. Schlagt mich tot, ich weiß nicht weiter. Zur not mus ich mit Timern arbeiten, aber das ist ja nicht so elegant.

    OS: WinXP
    IDE: Dev-C++ 4.9.9.1(stan-dart)

    danke schonmal



  • Bei mir läuft es nach deiner Beschreibung.

    /*-----------------------------------------------------------------------
      Muster Window.cpp 
    
      www.winapi.net
      -----------------------------------------------------------------------*/
    
    #include <windows.h>
    #include <commctrl.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
    	InitCommonControls();
       static TCHAR szAppName[] = TEXT ("Klassenname");
       HWND         hwnd;
       MSG          msg;
       WNDCLASSEX   wndclassex = {0};
    
       wndclassex.cbSize        = sizeof(WNDCLASSEX);
       wndclassex.style         = CS_HREDRAW | CS_VREDRAW;
       wndclassex.lpfnWndProc   = WndProc;
       wndclassex.cbClsExtra    = 0;
       wndclassex.cbWndExtra    = 0;
       wndclassex.hInstance     = hInstance;
       wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
       wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);
       wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
       wndclassex.lpszMenuName  = NULL;
       wndclassex.lpszClassName = szAppName;
       wndclassex.hIconSm       = wndclassex.hIcon;
    
       if (!RegisterClassEx (&wndclassex))
       {
          MessageBox (NULL, TEXT ("RegisterClassEx fehlgeschlagen!"),
                      szAppName, MB_ICONERROR);
          return 0;
       }
    
       hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, // erweiterter Fensterstil
                      szAppName, // Name der Fensterklasse
                      TEXT ("Fenstertitel"), // Fenstertitel
                      WS_OVERLAPPEDWINDOW, // Fensterstil
                      CW_USEDEFAULT, // X-Position des Fensters                      
                      CW_USEDEFAULT, // Y-Position des Fensters       
                      CW_USEDEFAULT, // Fensterbreite                 
                      CW_USEDEFAULT, // Fensterhöhe                
                      NULL, // übergeordnetes Fenster
                      NULL, // Menü           
                      hInstance, // Programm-Kopiezähler (Programm-ID)            
                      NULL); // zusätzliche Parameter
    
       ShowWindow (hwnd, iCmdShow);
       UpdateWindow (hwnd);
    
       HWND video = video = Animate_Create(hwnd,502,WS_CHILD| WS_VISIBLE,hInstance);
       Animate_Open(video,"C:\\Windows\\clock.avi");
       Animate_Play(video,0,-1,-1);
    
       while (GetMessage (&msg, NULL, 0, 0))
       {
          TranslateMessage (&msg);
          DispatchMessage (&msg);
       }
       return msg.wParam;
    }
    
    // Die Hauptnachrichtenschleife
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       switch (message)
       {
       case WM_CREATE:
          return (0);
    
       case WM_DESTROY:
          PostQuitMessage (0);
          return (0);
       }
    
       return DefWindowProc (hwnd, message, wParam, lParam);
    }
    


  • Sehr merkwürdig. Das ging bei mir jetzt auch, also muss es wohl am Restcode liegen. Hab jetzt ziemlich viel ausgeklammert, bis kaum noch was da war und siehe da: der fehler weg. So hab ich jetzt den fehler lokalisieren können:

    case WM_COMMAND:
            {            
                switch(wParam)
                {  
    ...
    default:
                    {
                        FSOUND_PlaySound(1,sklick);
    
                        int a=strlen(Button[wParam].slideshow);
                        char *option = new char[a+L_SLIDE+work_dir_len+4];
                        strcpy(option,"/slideshow=");
                       // MessageBox(hwnd,option,"DIR",0);
                        strncat(option,work_dir,work_dir_len+1);
                        strncat(option,"slideshows\\",L_SLIDE);
                        strncat(option,Button[wParam].slideshow, strlen(Button[wParam].slideshow)); 
                        //MessageBox(hwnd,work_dir,"DIR",0);
                        ShellExecute(0,"open",iview_dir,option,"",SW_SHOWNORMAL);
                        //MessageBox(hwnd,work_dir,"DIR",0);
                        delete option;
                    }
    }
    

    Das stammt aus meiner WM_COMMAND Behandlung. Auf Knopfdruck wird von hier aus Irfanview aufgerufen, soll als CD laufen, deshalb das umständliche Stringgecatte. Anscheinend, wird beim Starten des Programms also wenn das Video startet, WM_COMMAND versand. Da ich die Buttons über den default Zweig steuere und wParam als Index für die Buttons benutze wird bei einem nicht definiert wParam zustande ein ungültiger Vorgang gestartet. Sowas ist natürlich eigentlich nicht gewünscht, aber da ich das Video eh nur im AboutDialog laufen lassen will und das im Hauptframe nur zum Testen war (das hat man dann davon), ist das gar nicht so schlimm, denn im Dialog gehts jetzt. 🙂

    Kann mir trotzdem einer sagen, warum da WM_COMMAND versand wird oder wie ich vielleicht die Buttonbehandlung besser machen kann. Damit ich sowas aus dem Weg gehn könnte?

    danke schön, auch wenn ichs jetzt selbst "gelöst" hab. 🙄



  • switch auf wParam für die WM_COMMAND Nachricht macht wenig Sinn. Man muss sich das LOWORD oder das HIWORD angucken. Aber nicht beides zusammen.

    wParam
    The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero.
    The low-order word specifies the identifier of the menu item, control, or accelerator.



  • ACN_START

    Notifies an animation control's parent window that the associated AVI clip has started playing. This notification message is sent in the form of a WM_COMMAND message.



  • Ja, ja, so ist das, wenn man sich nicht so auskennt. Die Tücke lauert wie so oft im Detail.

    Danke für die Hilfe, jetzt funktioniert alles so, wie ich es will. 🙂
    Super!

    Schade, dass der DevC++ debugger noch nicht so gut ist, wie zum Bespiel der von Delphi (nein ich hab nicht mit Object Pascal programmieren gelernt! 😉 ), sonst hätte ich mir einige Zeit gespart. Naja, man lernt nie aus.

    also, danke nochmals, ihr Checker! 😃


Log in to reply