WinAPI umwandeln



  • Quasi dasselbe wie im Post über mir:

    Du kannst dir eine Dummyfunktion schreiben und die WinMain lassen wie sie ist.

    int main(int argc, char *argv[]){
        return WinMain(GetModuleHandle(NULL), 0, argc[0], SW_SHOW);
    }
    

    argc[0] und LPSTR lpCmdLine (der dritte Parameter von WinMain) stimmen nicht ganz überein, bei der WinMain fehlt der eigene Programmname, aber den kannst du auch noch in der main rausfiltern. Vielleicht willst du auch was anderes als SW_SHOW nehmen.


  • Mod

    Schalte das Projekt in den Linker Optionen von Console auf Windows um!



  • Schonmal vielen Dank an alle, dann ist ja doch noch nicht alle HOffnung verloren 🙂

    werde mich nochmal an dem Projekt versuchen und dann Ergebnisse melden.

    @Martin Richter: du meinst das bestehende Projekt oder? werd ich später mal probieren, aber wenn von a->b nicht geht, warum sollte es dann andersrum klappen 😕



  • Hallo, habe jetzt eure Vorschläge umgesetzt und es funktioniert (fast) alles.
    Ich bin mir zwar nicht sicher ob die Frage zu 100% in diese Forum gehört, aber ich möchte ungerne noch einen neuen Thread aufmachen...

    Hier mal ein Auszug des Programmes:

    // ******************************************************************
    // Globale Variablen
    LPDIRECTINPUT8            g_pDInput = NULL;    // IDirectInput8-Objekt
    LPDIRECTINPUTDEVICE8    g_pJoystick = NULL;    // Schnittstelle des Joysticks
    GUID                    JoystickGUID;        // GUID des verwendeten Joysticks
    HINSTANCE hInstance = GetModuleHandle(NULL);
    
    BOOL CALLBACK EnumJoysticksCallback(LPCDIDEVICEINSTANCE ,void* );
    bool InitJoystick(HWND );
    bool DlgProc(); //HWND hDlg,    unsigned int ,    WPARAM
    bool UpdateJoystickState(HWND );
    
    HWND hDlg;
    unsigned int uiMsg;
    WPARAM WParam;
    
    // Windows-Hauptfunktion
    int main()
    {
        HWND hDlg;
        //HINSTANCE hInstance;
        // das IDirectInput8-Objekt wird mit der Funktion DirectInput8Create erstellt.
    
        if(FAILED(DirectInput8Create(hInstance,                // Instanz
                                     0x0800,                // Version
                                     IID_IDirectInput8,        // Schnittstellenversion
                                     (void**)(&g_pDInput),    // Doppelzeiger auf Objekt
                                     NULL)))                // nicht wichtig
        {
            printf("IDirectInput8-Objekt konnte nicht erstellt werden!");
            getchar();
            return 1;
        }
        printf("IDirectInput8-Objekt wurde angelegt!\n");
    
        DlgProc();
    }
    
    // ******************************************************************
    // Dialogrückruffunktion
    bool DlgProc()
    {
        char eingabe;
        bool ende=false;
    
        do
        {
        fflush(stdin);
        printf("a. Initialisieren\n");
        printf("b. Aktivieren\n");
        printf("c. Joystick-Status\n");
        printf("d. Initialisieren\n");
        printf("e. Ende\n");
        printf("Auswahl : ");
        scanf("%c",&eingabe);
    
        //switch(uiMsg)
        switch(eingabe)
        {
        //case WM_INITDIALOG:
        case 'a':
            // Icon setzen
            SetClassLong(hDlg, GCL_HICON, (LONG)(LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1))));
    
            // Den Joystick initialisieren!
            if(InitJoystick(hDlg))
            {
                printf("Joystick konnte nicht initialisiert werden!\n");
                EndDialog(hDlg, 1);
            }
    
            // Timer einstellen, so dass alle 0.05 Sekunden eine WM_TIMER-
            // Nachricht verschickt wird. Dort wird dann der Zustand des
            // Joysticks aktualisiert.
            SetTimer(hDlg, 0, 50, NULL);
            printf("Joystick wurde Initialisiert\n");
            break;
    
        //case WM_ACTIVATE:
        case 'b':
            if(LOWORD(WParam) != WA_INACTIVE)
            {
                // Das Fenster wurde gerade aktiv.
                // Direkten Zugriff aktivieren!
                if(g_pJoystick != NULL) g_pJoystick->Acquire();
            }
            printf("Joystick wurde Aktiviert\n");
            break;
    
        //case WM_TIMER:
        case 'c':
            // Status des Joysticks aktualisieren und anzeigen
            UpdateJoystickState(hDlg);
            break;
    
        //case WM_CLOSE:
        case 'd':
            EndDialog(hDlg, 0);
            break;
    /*
        case WM_COMMAND:
            switch(LOWORD(WParam))
            {
            case IDC_OK:
                // Dialog beenden, wenn OK angeklickt wurde
                EndDialog(hDlg, 0);
                break;
            }
    */
        case 'e':
            printf("beenden...\n");
            ende=true;
            break;
    
        default:
            printf("Falsche Eingabe\n");
        }
    
        }while(ende==false);
    
        //case WM_DESTROY:
        // Das Dialogfenster wird geschlossen. Aufräumarbeiten erledigen!
        KillTimer(hDlg, 0);
        if(g_pDInput != NULL) g_pDInput->Release();
        if(g_pJoystick != NULL)
        {
            g_pJoystick->Unacquire();
            g_pJoystick->Release();
        }
        return TRUE;
    }
    

    Ich Rufe nun immer die DLG Proc auf und initialisiere den Joystick,aktiviere ihn....Dies klappt auch alles ohne Fehler.
    Das Problem ist jetzt mit der Abfrage des eigentlichen Joystickstatus :

    bool UpdateJoystickState(HWND hDlg)
    {
        DIJOYSTATE2    JoystickState;        // Status des Joysticks
        char        acButtonsText[256];    // Text für die gedrückten Knöpfe
        HRESULT        r;
    
        printf("Jetzt Daten abfragen.\n");
    //******* WHILE - ANFANG ********************
        do
        {
    
        // Daten abfragen
        r = g_pJoystick->Poll();
        if(r == DIERR_INPUTLOST)
        {
            // Zugriff verloren - erneut versuchen
            g_pJoystick->Acquire();
        }
    
        if(FAILED(r))
        {
            // Abfrage hat nicht funktioniert!
            // Wahrscheinlich ist das Fenster gerade nicht aktiv.
            //printf("Fehler beim Abfragen der Eingabedaten!");
            //return FALSE;
        }
    
        // Zustand abfragen
        g_pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &JoystickState);
    
        // Anzeigen generieren
    
        if ( ((JoystickState.lX)==0) && ((JoystickState.lY)==0) )   
        {
            printf("Beides Null.\n");
        }
    
        else if ( ((JoystickState.lX)>60000) && ((JoystickState.lY)>60000) )
        {
            printf("Beides ueber 60000");
        }
        }while(1);
    
        return TRUE;
    }
    

    Habe es jetzt probeweise in eine Endlosschleife gepackt um zu sehen ob noch Werte ankommen bzw. die beiden Abfragen erfüllt werden. Leider ist dies momentan nicht der Fall.

    Kann mir hier vielleicht jemand einen Tipp geben? Dachte erst er hätte Probleme mit g_pJoystick und dessen Funktionen, aber diese kann ich alle auswählen.

    Vielen Dank nochmals.


  • Mod

    Warum hast Du keine Fehlerbehandlung?
    Was liefert denn Poll als Ergebnis?
    Was liefert GetDeviceState als Ergebnis?

    Wie wäre es wenn Du erstmal selber die minimale Fehlersuche machst? :xmas1:



  • Hallo,

    habe durch deine Hinweise meine Fehler schon gefunden. Hatte aber nur Bedingt mit dem bestehendem Quellcode zu tun.

    if(LOWORD(WParam) != WA_INACTIVE)
            {
                // Das Fenster wurde gerade aktiv.
                // Direkten Zugriff aktivieren!
                if(g_pJoystick != NULL) g_pJoystick->Acquire();
            }
    printf("Joystick wurde Aktiviert\n");
    

    Das Acquire wurde nicht ausgeführt...nun gehts 🙂

    Inwieweit würdest du denn in so einem Beispielprogramm eine Fehlerbehandlung machen? Ist ja jetzt wirklich nur ein Programm zum "rumspielen" und ausprobieren der Joystick-Funktionen.

    Aber trotzdem vielen Dank für den "Arschtritt" 😉



  • rückgabewerte nicht prüfen und sich wundern, wenn nix funktioniert ist einfach immer wieder ein highlight in diesem forum. warum rückgabewerte prüfen, hauptsache es kompiliert, gelle?



  • gaaaaaaaaaaaaaaaaanz ruhig Durchatmen 🙂
    Ist wohl noch kein Programmierkünstler vom Himmel gefallen...oder vllt doch? Bist du der Auserwählte?

    SORRY für OFFTOPIC, aber musste gerade sein.....



  • so was lernt man in jedem n00b buch auf seite 3.



  • Ich glaube nicht, dass in den samples umsonst soviel Quellcode steht... 🙄

    Ich habe die auch noch net ganz verstanden drum kann ich dir nicht genau sagen was alles anders ist, schau sie dir lieber mal an.



  • @DarkShadow44
    Sorry, aber ich kann deine Aussage gerade nicht ganz interpretieren... 😕



  • Dein code siehet SEHR kurz aus...

    Deshalb glaube, ich dass du dir die samples amn anschauen solltest, auch wegen Fehler-Handling 😉


Anmelden zum Antworten