CreateFile
-
ich versuch eine bitmap datei mit folgendem code zu öffnen:
hFile=CreateFile(pFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if(GetLastError()==0) { throw"Datei existiert nicht!"; }
Das problem ist das der rückgabewert von GetLastError() immer 0 ist.machn ich was falsch?
PS: Der Pfad stimmt defintiv.
-
Ist doch toll. Wenn GetLastError() 0 zurückgibt, ist kein Fehler aufgetreten. Du solltest lieber so testen
if(hFile == INVALID_HANDLE_VALUE) {
-
ups hat ich mich in der msdn verlesen *g*
hab jetzt so gemacht das ergebnis is das er absturzt ich verweiß auf falschen speicher bzw pointer.mh kann des noch des file objekt sein?
der rest von der funktion is so:
if(!ReadFile(hFile,&PicFileHeader,sizeof(PicFileHeader),&dwCache,NULL)) { CloseHandle(hFile); char buffer[100]; sprintf(buffer,"%s: ReadFile(BITMAPFILEHEADER)",pFile); throw buffer; } if(!ReadFile(hFile,&PicInfoHeader,sizeof(PicInfoHeader),&dwCache,NULL)) { CloseHandle(hFile); char buffer[100]; sprintf(buffer,"%s:ReadFile(BITMAPINFOHEADER)",pFile); throw buffer; } lpPic = (UCHAR*) malloc(PicInfoHeader.biSizeImage); if(lpPic==NULL) { throw"Kein Speicher mehr verfügbar!"; } if(!ReadFile(hFile,lpPic,PicInfoHeader.biSizeImage,&dwCache,NULL)) { CloseHandle(hFile); char buffer[100]; sprintf(buffer,"%s: Lesen von Daten",pFile); throw buffer; } CloseHandle(hFile); CDirectGraphics::GetClass().GetDevice()->CreateTexture(nWidth,nHeight,1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &TempTexture.m_lpTexture); if(FAILED(TempTexture.m_lpTexture->LockRect(0,&rc,NULL,0))) { char buffer[100]; sprintf(buffer,"%s: Locken von Texture",pFile); throw buffer; } nPitch = rc.Pitch >> 2; lpRam = (DWORD*) rc.pBits; for(int y=0;y<nHeight;y++) { for(int x=0;y<nWidth;x++) { memcpy(&dwColor,&lpPic[(y*nWidth+x)*3], sizeof(BYTE)*3); ((DWORD*)lpRam)[x+(y*nPitch)] = dwColor; } } if(FAILED(TempTexture.m_lpTexture->UnlockRect(0))) { char buffer[100]; sprintf(buffer,"%s: Locken von Texture",pFile); throw buffer; } TempTexture.m_pFile = pFile; TempTexture.m_dwAlphaKey = dwAlphaKey; TempTexture.m_nHeight = nHeight; TempTexture.m_nWidth = nWidth; m_vecTexture.push_back(TempTexture); return m_vecTexture.size() - 1; }
-
kürz mal deinen code auf das nötigste
-
ReadFile(hFile,&PicFileHeader,sizeof(PicFileHeader),&dwCache,NULL)) ReadFile(hFile,&PicInfoHeader,sizeof(PicInfoHeader),&dwCache,NULL) lpPic = (UCHAR*) malloc(PicInfoHeader.biSizeImage); ReadFile(hFile,lpPic,PicInfoHeader.biSizeImage,&dwCache,NULL)) // hat nix mit winapi zu tun fehler könnte aber auch hier liegen TempTexture.m_lpTexture->LockRect(0,&rc,NULL,0))) nPitch = rc.Pitch >> 2; lpRam = (DWORD*) rc.pBits; for(int y=0;y<nHeight;y++) { for(int x=0;y<nWidth;x++) { // Farb infos kopiren memcpy(&dwColor,&lpPic[(y*nWidth+x)*3], sizeof(BYTE)*3); // Farbinfos zu weisen ((DWORD*)lpRam)[x+(y*nPitch)] = dwColor; } } TempTexture.m_lpTexture->UnlockRect(0)
[ Dieser Beitrag wurde am 09.07.2003 um 20:10 Uhr von Die Happy editiert. ]
-
Hi,
ich hab das selbe Problem. Du hast dein ertes ja anscheinend schon gelöst.
Wo hast du denn die bmp-Datei hingetan(welcher Ordner) und wie hast du die Funktion aufgerufen, sodass es funktioniert? Danke schon mal.
mfg Julian
-
Du sollst gegen INVALID_HANDLE_VALUE checken und nicht mit !
-
Hallo,
mein Problem ist aber nicht der Rückgabewert der Funktion, sondern der Aufruf der Funktion. Wo muss denn die BMP-Datei liegen, dass das Programm sie zur Laufzeit findet. Wenn ich sie in den Ordner der .exe-Datei tu wird sie nicht gefunden.
mfg Julian
-
-
Was hast du denn in pFile angegeben? - sollte imho ein absoluter Pfad sein
-
Momentan hab ich einfach nur den Namen der Datei angegeben.
Das schaut dann ungefähr so aus CreateFile(BmpDatei.bmp,...,...,.....).
Stimmt es so oder wie soll ich es machen?
mfg Julian
-
abseluter pfad is der ganze pfad richtigß ich hab nen absleuten pfand angegeben.
und es funtzt au net.mh kann man en bitmap auch anedrs laden ich hab am anfang die d3dx funktion benutzt die läd aber nur die ganze texture und nicht nur teile.
-
Bei mir gehts auch immer noch nicht. Stefan Zerbst gibt in seinem Buch auch nur die Datei ohne absoluten Pfad an, z.B. so CreateFile(Startscreen.bmp,...,...). Aber bei mir funktioniert es nicht wenn ich es so mache. Weiß jmand vielleicht warum? Danke schon mal im voraus
mfg Julian
-
Startest du die Anwendung evtl. direkt aus VC++ heraus? Dann ist nämlich imho das aktuelle Verzeichnis anders gesetzt (Projekt-Ordner?). Wenn du sie über den Windows-Explorer o.ä. startest ist dies aber das Release bzw. Debug-Verzeichnis
-
Hallo,
ich hab beides mal ausprobiert und es funktioniert nicht. Vielleicht liegt es ja an der Funktion, die ich für das Öffnen der Datei geschrieben hab?
Hier ist sie:HANDLE Oeffne_Datei(const char * Datei_Name) { HANDLE hDatei; hDatei = CreateFile(Datei_Name,GENERIC_READ,FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); if(hDatei = INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE; return hDatei; }
mfg Julian
-
Frage: Warum benutzt Ihr nicht einfach LoadBitmap ?
-
This function has been superseded by the LoadImage function.
-
hDatei = CreateFile(Datei_Name,GENERIC_READ,FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
Jetzt ist hDatei ein Handle auf Deine Datei...
if(hDatei = INVALID_HANDLE_VALUE)
Jetzt weist Du hDatei den Wert INVALID_HANDLE_VALUE zu...
Meinst Du das macht Sinn?
-
bei if() immer == nehmen