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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

25.09.2015, 17:26

Fehler im Listing 2.51 (Seite 110)?

Hallo Leute,

ich habe seit langen mal wieder mit Direct3D Kontakt gehabt und wollte als "Einstieg" das Listing 2.51 schreiben. Das sieht wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <Windows.h>
#include <stdio.h>
#include <d3d9.h>

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    char *pcCmdLine,
    int iShowCmd)
{
    // Schnittstelle für Direct3D erzeugen
    PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if (!pD3D)
    {
        MessageBox(NULL, "Fehler beim erstellen der Schnittstelle!",
            "Fehler", MB_OK | MB_ICONEXCLAMATION); // Fehler!

        return 1;
    }

    // Anzahl der Adapter ermitteln
    int iNumAdapters = pD3D->GetAdapterCount();

    // Speicher reservieren und Informationen über jeden Adapter sammeln
    D3DADAPTER_IDENTIFIER9* pAdapters = new D3DADAPTER_IDENTIFIER9[iNumAdapters];

    for (int iAdapter = 0; iAdapter < iNumAdapters; iAdapter++)
    {
        if (FAILED(pD3D->GetAdapterIdentifier(iAdapter, 0,
            &pAdapters[iAdapter])))
        {
            // Fehler!
            MessageBox(NULL, "Adapterinformationen konnten nicht abgefragt werden!",
                "Fehler!", MB_OK | MB_ICONEXCLAMATION);

            // Aufräümen
            pD3D->Release();
            delete[] pAdapters;
            return 1;
        }

        // Adapterinformationn anzeigen
        char acAdapterInfo[1024];
        sprintf(acAdapterInfo, "Adapter-ID: %d\n"
                                "Name: %s\n",
                                "Treiber: %s\n",
                                "nTreiberversion: %",

                                iAdapter,
                                pAdapters[iAdapter].Description,
                                pAdapters[iAdapter].Driver,
                                pAdapters[iAdapter].DriverVersion);

        MessageBox(NULL, acAdapterInfo, "Adapter gefunden",
            MB_OK | MB_ICONINFORMATION);
    }

    // Aufräumen
    pD3D->Release();
    delete[] pAdapters;

    return 0;

}


Jetzt werden alle MessageBoxen dort rot unterstrichen, wo "..." steht. Hier die Fehlerausgabe aus VS 2013:
Fehler 1 error C2664: 'int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)' : Konvertierung von Argument 2 von 'const char [41]' in 'LPCWSTR' nicht möglich
Fehler 2 error C2664: 'int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)' : Konvertierung von Argument 2 von 'const char [53]' in 'LPCWSTR' nicht möglich
Fehler 3 error C2664: 'int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)' : Konvertierung von Argument 2 von 'char [1024]' in 'LPCWSTR' nicht möglich

Was habe ich falsche gemacht? Habe ich irgendwas überlesen bzw. übersehen?
Vielen Dank im Voraus :)

2

25.09.2015, 19:22

Einmal Google benutzen würde dich weniger Zeit Kosten als diesen Post hier zu Verfassen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

3

25.09.2015, 19:37

Ich weiß, wie man eine MessageBox erstellt, aber wenn ich das so abändere, dass es keine Syntax-Errors gibt, bekomme ich nur irgendwelche chinesischen oder japanischen Schriftzeichen angezeigt...

4

25.09.2015, 20:08

Dein Compiler verwendet Multibyte-Zeichen (mehrere Bytes pro Zeichen, z.B. für Unicode). MessageBoxA will ein Byte pro Zeichen. Quetscht du nun dein Multibytezeichenkram da rein, kommt natürlich Unsinn heraus ;)
Nahezu alle WinAPI-Funktionen werden einmal mit Suffix 'A', für Ansi=1 Byte pro Zeichen und 'W', 'wide char', 2 Bytes pro Zeichen, angeboten.
Normalerweise sind Funktionen ohne diese Suffixe nur makros, welche abhängig der Compilereinstellungen entweder die Unicode- oder Ansi-Version ersetzen.
Im Endeffekt musst du also dich also nach diesen Einstellungen richten, d.h. wsprintf, std::wstring, L".." etc. benutzen (empfohlen) oder du änderst die Einstellungen bzw. benutzt explizit die Ansi-Version einer WinAPI-Funktion.

5

25.09.2015, 22:14

Lange Rede, kurzer Sinn: Ändere den Zeichensatz in den Projekt-Einstellungen... ;)
fka tm

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

6

26.09.2015, 14:29

Tut mir led für die dumme und unqualifizierte Frage, aber wo finde ich diese Einstellung? (Bild im Anhang)
»cojo2015« hat folgendes Bild angehängt:
  • Unbenannt.PNG

7

26.09.2015, 14:37

Zeichensatz. Viertes von unten. Da wo Unicode steht...
fka tm

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

8

26.09.2015, 20:36

Ah Danke vielmals :thumbsup:

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

9

26.09.2015, 20:48

Aber jetzt bekomme ich trotzdem noch einen Fehler:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion "_WinMain@16".

Wo habe ich was vergessen? ?(

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

10

26.09.2015, 20:50

Ah, habs gelöst. Hatte die *.lib falsch geschrieben...

Werbeanzeige