Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.05.2011, 13:48

Tribaseengine in SDK 7.1 einbinden

Hallo zusammen,

ich habe aus dem Windows-SDK 7.1 das Beispielprogramm AmCap kompiliert und ausgeführt. Nun möchte ich in diesem Programm die Achsenwerte eines Joysticks verarbeiten. Im Buch das Beispiel 4. Allerdings erhalte ich sobald ich die Tribaseengine einbinde folgenden Fehler: "need to include strsafe.h after tchar.h". Folgenden Link habe ich dazu gefunden: http://social.msdn.microsoft.com/forums/…e-6f139df18f71/

Meine Frage: Benötige ich die Tribaseengine für das Joystick-Beispiel überhaupt oder kann ich mir einige Teile aus dem Code rauskopieren? Wenn ja, hat jemand einen Tipp? ;(

Vielen Dank.

datatom

2

17.05.2011, 15:25

Die Tribase-Engine brauchst du nicht.
Das Beispielprogramm aus Kapitel 4 verwendet, soweit ich das sehe, lediglich ein paar eigene Datentypen und Konstanten (tb*), die du ersetzen kannst.
Alles andere ist DirectInput.
fka tm

3

17.05.2011, 20:21

Das habe ich so gemacht und ich kann die Achsenwerte auf dem Dialogfenster ausgeben :D

Aber wenn ich das Ganze in dem Programm AmCap aus dem SDK 7.1 Samples einbinde erhalte ich drei Fehler:

An der Programmstelle:

C-/C++-Quelltext

1
2
3
4
5
6
7
// Erster Schritt: das IDirectInput8-Objekt wird mit der Funktion
// DirectInput8Create erstellt.
if(FAILED(DirectInput8Create(hInst, // Instanz
0x0800, // Version
IID_IDirectInput8, // Schnittstellenversion
(void**)(&g_pDInput), // Doppelzeiger auf Objekt
NULL))) // nicht wichtig

Fehler:
1>amcap.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_DirectInput8Create@20" in Funktion "_WinMain@16". :cursing:
1>amcap.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_IID_IDirectInput8W". :cursing:

An der Programmstelle:

C-/C++-Quelltext

1
2
// Als nächstes wird das Datenformat gesetzt.
if(FAILED(g_pJoystick->SetDataFormat(&c_dfDIJoystick2))) return TB_ERROR;

Fehler:
1>amcap.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_c_dfDIJoystick2". :cursing:

DirectInput ist eingebunden:

C-/C++-Quelltext

1
#include <DInput.h>


Ich verwende Includes und Libs aus Directx11.

Wie kommt dieser Fehler zustande?

Vielen Dank.

4

17.05.2011, 20:28

Hast du dinput.h und dinput8.lib in das Projekt eingebunden?
fka tm

5

17.05.2011, 21:34

DInput.h ist per Include eingebunden und die dinput8.lib per Zuweisung der Bibliothek.

Ich werde den Weg morgen anders herum gehen und den Quellcode von dem SDK 7.1 Sample AmCap in das funktionierende Joystick-Programm einfügen.

PS: Gibt es eigentlich das Joystickprogramm für Visual C++ 2010 Express auf Windows 7? Wie gesagt, dass Beispiel läuft zwar bei mir, aber nur die Werte der Achsen werden angezeigt. Welche Knöpfe ich gedrückt habe, bekomme ich nicht angezeigt. Ich musste z.B. in Visual C++ 2010 Express folgende Programmzeile ändern:

C-/C++-Quelltext

1
sprintf(acButtonsText, "%s%d  ", acButtonsText, a);

ändern in:

C-/C++-Quelltext

1
 _itow_s( a, acButtonsText, 10);

6

17.05.2011, 22:16

Liegt vermutlich nur an dem Codeabschnitt für die Ausgabe.
Bzw. an dem verwendeten Zeichensatz des AmCap-Projekts.
Verwende für die Ausgabe statt sprintf die entsprechenden neueren Zeichencode-Varianten.

Ansonsten lohnt sich ein Blick auf das Beispiel Kalibrierter Joystick.
fka tm

7

19.05.2011, 18:37

So ... ich habe nun den ursprünglichen Quellcode

C-/C++-Quelltext

1
sprintf(acButtonsText, "%s%d  ", acButtonsText, a);


geändert in

C-/C++-Quelltext

1
2
wchar_t acButtonsText[256];
       StringCbPrintf(acButtonsText, sizeof(acButtonsText), L"%d  ", a);


Der gedrückte Button wird nun angezeigt. Halte ich allerdings mehrere Buttons gedrückt, wird nur der mit der höchsten Nummer angezeigt, egal in welcher Reihenfolge gedrückt wurde. Die angezeigten Buttons stehen nicht mehr nebeneinander, sondern an der ersten Stelle.

Beispiel:

Normale Anzeige: 1 2 3 4
Neue Anzeige: 4 Also nur der Button mit der vier, auch wenn dieser zuerst gedrückt wurde und die anderen danach

Folgender Befehl mit %s%d fürht zum Fehler beim Programmablauf, sobald der erste Button gedrückt ist.

C-/C++-Quelltext

1
StringCbPrintf(acButtonsText, sizeof(acButtonsText), L"%s%d  ", a);


Woran kann das liegen?

8

20.05.2011, 08:40

C-/C++-Quelltext

1
StringCbPrintf(acButtonsText, sizeof(acButtonsText), L"%s%d  ", a);


Zwei Argumente werden erwartet, du übergibst aber nur eins (a).
Nur die Größe des Arrays anzugeben, reicht vermutlich nicht.

Also eher so:

C-/C++-Quelltext

1
StringCbPrintf(acButtonsText, 256 * sizeof(wchar_t), L"%s%d  ", string, dezimal);
fka tm

Werbeanzeige