Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
CorDharel Junior JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 73 Wohnort: Winterthur, Zürich, CH Medaillen: Keine
|
Verfasst am: 30.06.2005, 15:28 Titel: Kapitel 19 Fehler in erstellen sekundären Oberfläche |
|
|
Hallo zusammen
Ich habe einen Linkerfehler in meinem Programm von Kapitel 19 (Oberflächen und Sprites, Seite 321) und ich weiss nicht was zu tun ist
ich habe als Basis das DirectDrawProgramm genommen, mit der Render()Funktion. Es initialisiert alles, dann macht es in der Winmain Funktion die primäre Oberfläche, den Clipper und dann woltle ich die sekundäre Oberfläche erstellen.
Nun gibt er mir aber den Fehler:
Code: | Linking...
Oberflaeche.obj : error LNK2001: unresolved external symbol _DirectDrawCreateEx@16
Oberflaeche.obj : error LNK2001: unresolved external symbol _IID_IDirectDraw7
Debug/Oberflaeche.exe : fatal error LNK1120: 2 unresolved externals |
Was soll ich nur tun? *vonBrückeJump*
Der Code sollte richtig abgetippt sein. Hier der Codestart:
CPP: | #include <ddraw.h>
//anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);
//globale variable für das fensterhandle
HWND hWnd = 0;
//directdraw interface
LPDIRECTDRAW7 lpDD7 = NULL;
//oberflächen
LPDIRECTDRAWSURFACE7 lpDDSPrimary;
LPDIRECTDRAWSURFACE7 lpDDSurface;
//clipper
LPDIRECTDRAWCLIPPER lpDDClipper = NULL;
//struktur auf beschreibung von oberfläche
DDSURFACEDESC2 ddsd;
//sekundäre oberfläche
DDSURFACEDESC2 SurfDesc;
//callback funktion
LRESULT CALLBACK MessageHandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
//die objekte freigeben
void CleanUpDirectDraw(void);
//error funktion
int Error( char *msg );
//ddrawbeispiel
void Render(void);
//main funktion
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//fenster erzeugen und in handle speichern
//directdrawobjekt erzeugen
//kooperationsebene festlegen
//struktur initialisieren
//primäre oberfläche anlegen
//clipper anlegen
//clipper mit fenster verbinden
//clipper mit oberfläche verbinden
//SEKUNDÄRE OBERFLÄCHE ANLEGEN START
//oberflächenbeschreibung initialisieren
ZeroMemory(&SurfDesc, sizeof(SurfDesc));
SurfDesc.dwSize = sizeof(SurfDesc);
//caps, höhe und breite sollen berücksichtigt werden
SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
SurfDesc.dwWidth = 100;
SurfDesc.dwHeight = 100;
//oberfläche anlegen
if( FAILED( lpDD7->CreateSurface(&SurfDesc, &lpDDSurface,NULL)))
{
Error("Sek. Oberfläche anlegen ist fehlgeschlagen");
return -1;
}
|
_________________ Greetz CorDharel |
|
Nach oben |
|
|
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 30.06.2005, 15:30 Titel: |
|
|
libs gelinkt? |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 30.06.2005, 15:31 Titel: |
|
|
Hi,
kleiner Tipp: geh mal oben in die Suchfunktion, gib dort unter Benutznamen "Patrick" ein, dann suchst du nach #pragma comment lib ddraw.lib
Kurz: Du hast die Lib vergessen zu linken _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
CorDharel Junior JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 73 Wohnort: Winterthur, Zürich, CH Medaillen: Keine
|
Verfasst am: 30.06.2005, 17:25 Titel: |
|
|
Das kann ja nicht sein. Alle vorherigen Beispiele gingen problemlos! Dann hätte ich doch schon früher Probleme gehabt, nicht?
[Edit] Boah ich habt recht Dachte das hätte ich gemacht. Danke! _________________ Greetz CorDharel
Zuletzt bearbeitet von CorDharel am 30.06.2005, 17:39, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 30.06.2005, 17:28 Titel: |
|
|
Wenn Du das tust was ich gesagt habe findest Du diesen Thread:
http://www.jliforum.de/board/viewtopic.php?t=3728&highlight=pragma
Dort steht dann dieser Code:
CPP: | // Beispiel wo die dxguid.lib gelinkt wird
#pragma comment(lib, "dxguid.lib") |
Wenn Du nun in Deinem Handbuch nachguckst steht drin das DirectDraw die ddraw.lib benötigt.
Die wird so gelinkt:
CPP: | #pragma comment(lib, "ddraw.lib") |
Füge diese Zeile in Deinen Code ein und erledigt.
Tipp am Rande: Vergleiche die anderen Beispiele nie mit dem was Du grade hast. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 30.06.2005, 17:28 Titel: |
|
|
doch kann sein. Im Buch stand net, dass wenn du den Code selber abtippst, folgende Zeilen einfügen musst: CPP: | #pragma comment(lib, "ddraw.lib") |
Gruß DirectXer
EDIT: Menno, Patty war schneller |
|
Nach oben |
|
|
CorDharel Junior JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 73 Wohnort: Winterthur, Zürich, CH Medaillen: Keine
|
Verfasst am: 30.06.2005, 17:41 Titel: |
|
|
Hui es stimmt! Welch ein Segen über mich gekommen ist!
Das heisst mit
Code: |
#pragma comment(lib, "ddraw.lib") |
Binde ich eine Lib, die ich noch nicht hatte, mit Code ein, statt sie immer über "Projects > Settings > blabla" zu definieren.
Richtig?
BTW wer auch immer diesen Thread liest und ddraw.lib nun eingebunden hat: Vergiss dxguid.lib nicht!
(Juhui es funzt *freu* ) _________________ Greetz CorDharel |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 30.06.2005, 17:47 Titel: |
|
|
richtig. Mit dem #pragma kann man die Lib denau so linken wie über den Weg im Buch; also überdie Projekteinstellungen. IMHO ists aber mit dem #pragma übersichtlicher, denn da sieht man direkt in einem Blick auf den COde, was alles gelinkt weird. Is aber Geschmackssache
Gruß DirectXer |
|
Nach oben |
|
|
CorDharel Junior JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 73 Wohnort: Winterthur, Zürich, CH Medaillen: Keine
|
Verfasst am: 30.06.2005, 18:05 Titel: |
|
|
Da stimme ich dir zu. So ist es viel praktischer. _________________ Greetz CorDharel |
|
Nach oben |
|
|
CorDharel Junior JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 73 Wohnort: Winterthur, Zürich, CH Medaillen: Keine
|
Verfasst am: 30.06.2005, 18:32 Titel: |
|
|
Hmm jetzt hab ich das Problem dass ich das Bild nicht laden kann:
Code: | LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPSTR File, int dWidth, int dHeight)
{
//device context für das bild und die oberfläche
HDC hBmDC, hSurfDC;
//handle der zu ladenden bitmap
HBITMAP hBM;
//oberflächenbeschreibung
DDSURFACEDESC2 SurfDesc;
//zeiger auf die oberfläche
LPDIRECTDRAWSURFACE7 lpDDSurface;
//bild laden
hBM = (HBITMAP)LoadImage(0,File, IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);
//ist ein fehler aufgetreten?
if(NULL == hBM)
{
Error("Fehler 1");
return NULL;
}
...... |
Das gibt "Fehler 1".
Liegt das jetzt am Code oder am Bild? Ich habe ein Bild genommen (100*100), es zuerst als 24 Bit dann mit 16 Bit gespeichert (im MSPAINT) und es im G:\ abgelegt. die Funktion rufe ich so auf:
Code: | //sekundäre oberfläche laden
lpDDSurface = CreateSurfaceFromBitmap("G:\britney.bmp",100,100); |
Hmm vielleicht mag das Programm Britney Spears nicht _________________ Greetz CorDharel
Zuletzt bearbeitet von CorDharel am 30.06.2005, 18:34, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 30.06.2005, 18:34 Titel: |
|
|
CorDharel hat Folgendes geschrieben: | Hmm vielleicht mag das Programm Bitney Spears nicht |
könnt ich mir auch vorstellen |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 30.06.2005, 18:34 Titel: |
|
|
Du schreibst:
lpDDSurface = CreateSurfaceFromBitmap("G:\britney.bmp",100,100);
Das ist inkorrekt: wenn schon:
lpDDSurface = CreateSurfaceFromBitmap("G:/britney.bmp",100,100); _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
|
Nach oben |
|
|
CorDharel Junior JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 73 Wohnort: Winterthur, Zürich, CH Medaillen: Keine
|
Verfasst am: 30.06.2005, 18:42 Titel: |
|
|
Oh stimmt Ich hab mich irreleiten lassen. im Buch steht nämlich
Code: |
lpDDSurface = CreateSurfaceFromBitmap("G:\\britney.bmp",100,100);
|
jetzt funktioniert es schon zur Hälfte = es gibt keinen Fehler mehr aus
Ich glaub ich weiss woran es liegt. Im Buch sieht der Aufruf so aus:
Code: | lpDDSPrimary->BltFast(10,10,lpDDSurface,NULL,DDBLT_WAIT,NULL); |
aber der Compiler sagt, die Funktion BltFast nimmt keine 6 Parameter, so hab ich einfach mal einen gelöscht
Code: | lpDDSPrimary->BltFast(10,10,lpDDSurface,NULL,DDBLT_WAIT); |
und darum geht es jetzt wohl nicht _________________ Greetz CorDharel |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
|