WinAPI umwandeln
-
Hallo, habe zur Zeit ein Problem (oder eher gesagt eine Frage) auf die ich keine Lösung finde.
Ich habe ein bestehendes Win32-Projekt, dass die Eingaben eines Joysticks auswertet. Dieses habe ich durch mehrere Tutorials erstellt.
Nun muss ich für die Aufgabe, dieses Programm in eine bestehende Win32-Konsolenanwendung implementieren. Ist dies überhaupt möglich????// Windows-Hauptfunktion int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { 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!"); do { DlgProc(hDlg,uiMsg,WParam,LParam); }while(1); }Dies ist jetzt nur die Main aber ich denke mal, dass der Fehler weniger am Quellcode selbst, sondern der Umsetzung scheitert.
Bekomme folgende Fehlermeldung :Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup". MSVCRTD.lib Fehler 5 fatal error LNK1120: 1 nicht aufgelöste externe Verweise. C:\CamRob\Code_Beispiele\Joystick\joystick_konsole\Debug\joystick_konsole.exeWenn mir jetzt einer sagt, dass es einfach nicht möglich ist, bin ich auch (mehr oder weniger) zufrieden.

Vielen Dank schonmal.
-
Die Initialisierung sieht SEHR kurz aus... Ich glaube nicht, dass die geht.
Konsolenanwendungen haben keine WinMain(), nur eine main().
Allerdings könnte es gehen wenn du das verwendest:
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!"); do { DlgProc(hDlg,uiMsg,WParam,LParam); }while(1); return 0; }
-
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.
-
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.
-
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
