Autor Wątek: WriteFile crash  (Przeczytany 1263 razy)

Offline Pirs01

  • Użytkownik

# Sierpień 27, 2010, 16:58:40
Program wysypuje mi sie na linijce:
WriteFile(hf, (LPVOID) pbPixels, 1, NULL, NULL);Naturlanie moje podejrzenie padlo na pbPixels ale kiedy debugguje (zalacznik) wszystko zdaje sie byc ok. Definicja pbPixels:
bool *pbPixels;Handle pliku tez jest wporzadku bo kiedy wykomentuje linijke WriteFile program tworzy plik i dziala gloadko.

Co moze byc przyczyna?
« Ostatnia zmiana: Sierpień 27, 2010, 17:01:34 wysłana przez Pirs01 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Liosan

  • Redaktor

# Sierpień 27, 2010, 17:09:17
pbPixels jest ... wskaźnikiem na boola? Przy wczytywaniu jednego bajta?

Liosan

Offline Pirs01

  • Użytkownik

# Sierpień 27, 2010, 17:21:59
No tak bool powinien niby byc jednym bitem ale tutaj: http://www.cplusplus.com/doc/tutorial/variables/ pisza ze ma rozmiar bajtu wiec sadzilem ze wszystko jedno czy uzyje bool czy char a bool byl nieco wygodniejszy w innym fragmencie kodu, Pozatym probowalem juz zmieniac deklaracje pbPixels na char* i nic to nie zmienilo.
« Ostatnia zmiana: Sierpień 27, 2010, 17:25:05 wysłana przez Pirs01 »

Offline Liosan

  • Redaktor

# Sierpień 27, 2010, 17:24:55
Zmieniałeś wskaźnik czy wskazywany blok pamięci? :)

Liosan

Offline Pirs01

  • Użytkownik

# Sierpień 27, 2010, 17:27:39
Jedno i drugie  ;)
char *pbPixels;
pbPixels = (char*) malloc(uliSize);
if(foregroundColor == GetPixel(hBitmapDC, uiX, uiY))
memcpy((void*) (pbPixels + uliIndex), (const void*) &bTrue, 1);
gdzie bTrue zostal oczywiscie takze zmieniony na char.
« Ostatnia zmiana: Sierpień 27, 2010, 18:09:52 wysłana przez Pirs01 »

Offline Dab

  • Redaktor
    • blog

# Sierpień 27, 2010, 17:36:34
A ten pbPixels w ogole na cos wskazuje?
Jak chcesz zapisac chara to mozna to zrobic tak:
char znak = 'x';
WriteFile(file, &znak, 1, ...)

Offline Pirs01

  • Użytkownik

# Sierpień 27, 2010, 17:39:41
pbPixels wskazuje na bufor przechowujacy mono bitmape przedstawiona w formie zer i jedynek (jak wyzej w kodzie).
Probuje zapisac tylko pierwszy bajt dla uproszczenia kodu ktory sie sypie.

HANDLE hf = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, (DWORD) 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
char znak = 'D';
//WriteFile(hf, (LPVOID) pbPixels, 105, NULL, NULL);
WriteFile(hf, (LPVOID) &znak, 1, NULL, NULL);
CloseHandle(hf);

Sypie sie tak samo...

Poprawka: sypie sie inaczej:
D zostaje zapisane do pliku ale i tak dostaje na linijce WriteFile: Access violation writing location 0x00000000.
« Ostatnia zmiana: Sierpień 27, 2010, 18:20:33 wysłana przez Pirs01 »

Offline Pirs01

  • Użytkownik

# Sierpień 27, 2010, 18:26:41
Moze to miec cos wspolnego z faktem ze program jest konsolowy?

EDIT:
Juz wiem. Trzeba uzyc czwartego argumentu: "__out_opt    LPDWORD lpNumberOfBytesWritten" mimo ze MSDN twierdzi ze nie trzeba.


Dzieki za pomoc.
« Ostatnia zmiana: Sierpień 27, 2010, 18:47:45 wysłana przez Pirs01 »

Offline Rolek

  • Użytkownik

# Sierpień 28, 2010, 00:17:58
Juz wiem. Trzeba uzyc czwartego argumentu: "__out_opt    LPDWORD lpNumberOfBytesWritten" mimo ze MSDN twierdzi ze nie trzeba.
Cytuj
This parameter can be NULL only when the lpOverlapped parameter is not NULL.
Czytaj dokładnie ;)

Offline Pirs01

  • Użytkownik

# Sierpień 28, 2010, 10:54:44
O masz! Jakos udalo mi sie przegapic te trzy literki "not" kiedy to czytalem  ::)

Sory za zamieszanie :-[
« Ostatnia zmiana: Sierpień 28, 2010, 10:58:13 wysłana przez Pirs01 »