D3DXCreateTextureFromFile returnt d3dxerr_invaliddata

11/12/2011 20:16 Omdi#1
Hallo,

Ich habe ein kleines Problem beim entwickeln einer Klasse.
Wenn ich D3DXCreateTextureFromFile aufrufe, wird immer
d3dxerr_invaliddata zurückgegeben. Die Textur ist im gleichen Ordner
wie die DLL.

Code :

Code:
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>

#pragma once
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
LPD3DXSPRITE sprite;
LPDIRECT3DTEXTURE9 gTexture;
void Init(LPDIRECT3DDEVICE9 pDevice,LPCTSTR path);
DWORD WINAPI Func(LPVOID lpParam);
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved )
{
if(fdwReason == DLL_PROCESS_ATTACH)
{
CreateThread(0,0,Func,0,0,0);
break;
}
return TRUE;
}

void Init(LPDIRECT3DDEVICE9 pDevice,LPCTSTR path)
{
    gTexture = NULL;
    sprite = NULL;
    HRESULT h1 = D3DXCreateSprite(pDevice,&sprite);
    if(h1 != S_OK)
    {
        MessageBox(NULL,L"Failed to Create Sprite",NULL,NULL);
        
    }
HRESULT h2 = D3DXCreateTextureFromFile(pDevice,path,&gTexture);


if(h2 != D3D_OK)
{
    if(h2 == D3DERR_NOTAVAILABLE){MessageBox(NULL,L"D3DERR_NOTAVAIBLE",0,0); }
    if(h2 == D3DERR_OUTOFVIDEOMEMORY){MessageBox(NULL,L"D3DERR_OUTOFVIDEOMEMORY",0,0); }
    if(h2 == D3DERR_INVALIDCALL){MessageBox(NULL,L"D3DERR_INVALIDCALL",0,0); }
    if(h2 == D3DERR_INVALIDCALL){MessageBox(NULL,L"D3DERR_INVALIDCALL",0,0); }
    if(h2 == D3DXERR_INVALIDDATA){MessageBox(NULL,L"D3DXERR_INVALIDDATA",0,0); }
    
}
}
DWORD WINAPI Func(LPVOID lpParam)
{
Init(/*Address of EndScene*/,"haha.png");
return 0;
}
11/12/2011 22:35 Xenox3#2
Du musst den vollen Pfad angeben .

oder eben mit

GetModuleFileName

arbeiten.
11/13/2011 08:20 Omdi#3
Ja natürlich habe ich auch schon gemacht.
Aber die haha.png liegt im gleichen Ordner.
11/13/2011 11:35 Tyrar#4
Quote:
#include <d3dx9.lib>
????
11/13/2011 11:47 Omdi#5
Der Code ist nur schnell hier hingeklatscht.
Im original Code siehts anders aus :'D
Das war nur ein Flüchtigkeitsfehler meinerseits hier ;>
11/13/2011 16:05 MrSm!th#6
Versuch halt nicht FromFileEx sondern FromMemoryEx und öffne und lies die Datei vorher mit CreateFile und ReadFile.

INVALIDDATA heißt aber normalerweise nicht, dass das File nicht gefunden wurde. Textur beschädigt oder in unbekanntem Format?
11/13/2011 16:11 Omdi#7
Quote:
Originally Posted by MrSm!th View Post
Versuch halt nicht FromFileEx sondern FromMemoryEx und öffne und lies die Datei vorher mit CreateFile und ReadFile.

INVALIDDATA heißt aber normalerweise nicht, dass das File nicht gefunden wurde. Textur beschädigt oder in unbekanntem Format?
Danke erstmal.

Diesen Gedanken hatte ich auch zu erst, aber dann habe ich es noch mit einer .dds und .jpg File versucht. Ging nicht.
Ich versuchs erstmal mit dem, was du mir vorgeschlagen hast.

Edit : Muss ich dafür noch irgendeine Header File hinzufügen?
Bei mir ist sie nämlich nicht definiert und im Internet findet man auch nicht viel zu der Funk.

Gibts denn irgendeinen anderen Weg, so ein Bild auf den Monitor zu zeichnen ;O?
Ich hab mal irgendwas mit "Surface" in dem Zusammenhang gehört.
11/13/2011 17:15 Xenox3#8
[Only registered and activated users can see links. Click Here To Register...]
11/13/2011 17:50 MrSm!th#9
Die Klasse macht intern doch auch nichts anderes.

Vielleicht war es auch FromMemory, weiß ich nicht mehr ;O
Google doch einfach D3DXCreateTexture, da solltest du alle Versionen finden.
Oder schau bei D3DXCreateTextureFromFileEx unter see also.

Also auf Texturen bist du so oder so angewiesen. Ob du sie normal erstellst oder mit den D3DX Funktionen bleibt dir überlassen. Zweiteres ist aber zu empfehlen, da du sonst das Image Format selbst parsen und eine Textur mit CreateTexture erstellen müsstest.

Du kannst auch ohne Sprites zeichnen, indem du mit DrawPrimitive(UP) und Vertices arbeitest ;O Nichts anderes macht die Sprite-Klasse intern.
Die Variante bevorzuge ich auch, da man da mehr Freiheiten hat, allerdings ist es auch komplizierter und teilweise verdammt schwer in D3D Hooks einzubauen, da manche Game-Einstellungen das massiv beeinflussen.

Ach ja: Ist nur ne Vermutung, aber vielleicht beduetet INVALIDDATA in diesem Fall auch, dass das Image Format und die Image Info, die daraus ausgelesen wird, nicht zu den Device Einstellungen passt, mit denen es erstellt wurde.
11/13/2011 18:14 Omdi#10
Hmm...
Beim Aufrufen von ImageInfoObjekt->DrawImage(...) crasht jedes Spiel ;O.
Ich schätze mal, dass es auch crashen würde, wenn ich es ohne Klasse machen
würde.
Ich versuch es einfach mal mir D3DXCreateTextureFromFileInMemoryEx, wenn das
Problem weiterhin besteht, melde ich mich einfach wieder.

Edit:

Mit D3DXCreateTextureFromFileInMemoryEx bekomme ich D3DERR_INVALIDCALL.
Ich vermute mal der Pfad ist ungueltig?
11/15/2011 14:49 Xyooz#11
Vllt liegt es auch an der statischen Lib, die du gemacht hast ô_O
11/15/2011 15:02 Omdi#12
Mir ist heute aufgefallen, dass es jetzt geht.
Aber nur auf meinem anderen Computer (Windows 7 64-Bit), und bei meinem anderen nicht
(WIndows 7 32-Bit).Woran kann das liegen?
Und wie Support schon sagte, ich habe mir eine statische lib gemacht, kann das daran liegen?
11/15/2011 15:54 MrSm!th#13
Nein, was soll die damit zu tun haben?

Hast du die richtigen redistributables im Dll Ordner?

Vielleicht liegts am DX Driver.
11/15/2011 19:03 Omdi#14
Welche redistributables ;O?

Edit : Ok, mit einer exe funktioniert es, aber wieso mit einer dll nicht ?

Ich hab die Lösung gefunden, das Bild musste im Spiel-Ordner sein und
nicht im Dll-Ordner ;>
11/15/2011 21:06 MrSm!th#15
Die d3dx9_XX.dll.

Alles klar. Joa, ich pack solche wichtigen Dateien bei Tests (bei denen die Dll nicht im Game Ordner ist) immer in alle notwendigen Ordner :P