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

12.06.2008, 15:44

Problem mit WinAPI und DirectX

Ich benutze Microsoft Visual C++ 2008 Express Edition und ich habe
den folgenden Code aus einem Tutorial auf www.directxtutorial.com.

Ich habe folgenden Code :

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// include the basic windows header files and the Direct3D header file

#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

// include the Direct3D Library file

#pragma comment (lib, "d3d9.lib")

// global declarations

LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface

LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class


// function prototypes

void initD3D(HWND hWnd);    // sets up and initializes Direct3D

void render_frame(void);    // renders a single frame

void cleanD3D(void);    // closes Direct3D and releases memory


// the WindowProc function prototype

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          L"WindowClass",
                          L"Our First Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          300, 300,
                          640, 480,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D

    initD3D(hWnd);

    // enter the main loop:


    MSG msg;

    while(TRUE)
    {
        DWORD starting_point = GetTickCount();

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        render_frame();

        while ((GetTickCount() - starting_point) < 25);
    }

    // clean up DirectX and COM

    cleanD3D();

    return msg.wParam;
}


// this is the main message handler for the program

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


// this function initializes and prepares Direct3D for use

void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);    // create the Direct3D interface


    D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information


    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use

    d3dpp.Windowed = TRUE;    // program windowed, not fullscreen

    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames

    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D



    // create a device class using this information and the info from the d3dpp stuct

    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    return;
}


// this is the function used to render a single frame

void render_frame(void)
{
    // clear the window to a deep blue

    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);

    d3ddev->BeginScene();    // begins the 3D scene


    // do 3D rendering on the back buffer here


    d3ddev->EndScene();    // ends the 3D scene


    d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen


    return;
}


// this is the function that cleans up Direct3D and COM

void cleanD3D(void)
{
    d3ddev->Release();    // close and release the 3D device

    d3d->Release();    // close and release Direct3D


    return;
}



Und es werden folgende Fehler gezeigt:

Quellcode

1
2
3
4
5
6
7
Verknüpfen...
LINK : C:\Dokumente und Einstellungen\Eigene Dateien\Visual Studio 2008\Projects\WhiteBox\Debug\WhiteBox.exe wurde nicht gefunden oder beim letzten inkrementellen Linkvorgang nicht erstellt; vollständiger Link wird durchgeführt.
main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""void __cdecl initD3D(struct HWND__ *)" (?initD3D@@YAXPAUHWND__@@@Z)".
C:\Dokumente und Einstellungen\Eigene Dateien\Visual Studio 2008\Projects\WhiteBox\Debug\WhiteBox.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Eigene Dateien\Visual Studio 2008\Projects\WhiteBox\WhiteBox\Debug\BuildLog.htm" gespeichert.
WhiteBox - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Was mache ich falsch.
Hamster->

Anonymous

unregistriert

2

12.06.2008, 15:54

Du machst eigentlich gar nichts falsch ;)

Was viele vielleicht hier nicht wissen: Die Headerdateien zu Direct3D sind zwar da (bis auf D3DX), aber nicht die Libraries ;)

Du musst die Direct3DCreate-Funktion mit LoadLibrary aus der d3d9.dll laden, dann hast du kein Problem mehr. ;)

Ansonsten: DirectX SDK installieren - ich bevorzuge aber eher ersteres.

3

12.06.2008, 16:06

wie sieht das dann im code aus?
Ich habs versucht aber es klappt immer noch net.
Liegt aber daran, das ich keine Ahnung von der LoadLibrary Funktion habe.
Hamster->

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

12.06.2008, 16:06

Hmm, er linkt doch gegen die d3d9.lib? Ich hab ewig nix mehr mit "purem" D3D gemacht, aber ich kann mich nicht entsinnen, dass ich jemals mehr als die Header includet und gegen die Library gelinkt habe.

Anonymous

unregistriert

5

12.06.2008, 21:28

Zitat von »"unsigned long"«

Was viele vielleicht hier nicht wissen: Die Headerdateien zu Direct3D sind zwar da (bis auf D3DX), aber nicht die Libraries ;)
Es handelt sich hier um vs2008.

Hab mal kurz was ausm Kopf zusammengebastelt, sollte aber laufen:

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
::IDirect3D9* create_direct3d9 (void)
{
    ::IDirect3D9* result = NULL;

        // load d3d9.dll 

    if (::HINSTANCE instance = ::LoadLibrary (_T ("d3d9.dll")) != NULL)
    {
            // function pointer typedef for Direct3DCreate9

        typedef ::IDirect3D9* (WINAPI *DIRECT3DCREATE)(::UINT version);

            // get handle of Direct3DCreate9 and create interface.

        if (DIRECT3DCREATE Direct3DCreate9_ = reinterpret_cast<DIRECT3DCREATE>(::GetProcAddress (instance, "Direct3DCreate9")) != NULL)
            result = Direct3DCreate9_ (D3D_SDK_VERSION);

            // release d3d9.dll

        ::FreeLibrary (instance);
    }

    return (result);
}

    // create interface:

::IDirect3D9* d3d9 = create_direct3d ();

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

12.06.2008, 21:48

Zitat von »"unsigned long"«

Zitat von »"unsigned long"«

Was viele vielleicht hier nicht wissen: Die Headerdateien zu Direct3D sind zwar da (bis auf D3DX), aber nicht die Libraries ;)
Es handelt sich hier um vs2008.



Wo ist 'da'?
Und was spricht dagegen das SDK zu installieren?

Anonymous

unregistriert

7

12.06.2008, 21:54

drakon
wie wo ist da?
Hier: C:\Programme\Microsoft SDKs\Windows\v6.0A\Include

Was dagegen spricht? Wers braucht, ich habs bis her noch nicht gebraucht ;) Dazu rockt dynamisches Laden einfach mehr.

Werbeanzeige