mam pewien obrazek w zasobach i nie wiem jak go "wypakowac" z programu do okreslonego katalogu
dla jasnosci programuje w Microsoft visual c++ v5.0
jezeli masz go w skompilowanym exeku to sprobuj programu resource hacker (obecnie funkcjonuje pod inna nazwa).
nie dokladnie mi o to chodzilo, byc moze zle to objasnilem
pisze program ktury w zasobach bedzie mial jakis obrazek i chce zeby przy okreslonym zdarzeniu wypakowal(lub skopiowal z zasobów) mi ten obrazek do okreslonego folderu
Poczytaj o:
- FindResource
- LoadResource
- SizeofResource
- LockResource
ok....poszedłem za waszymi podpowiedziami i udalo mi sie napisac takie cos
HRSRC res;
HGLOBAL hres;
DWORD hsize;
HANDLE hplik;
res = FindResource(NULL, MAKEINTRESOURCE(142), RT_RCDATA);
if(res == 0) MessageBox("BŁĄD res", "error", MB_OK);
hres = LoadResource(NULL, res);
if(hres == NULL) MessageBox("BŁĄD hres", "error", MB_OK);
hsize = SizeofResource(NULL, res);
hplik = CreateFile("c:\\plik.JPEG", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(hplik,(LPCVOID)hres, hsize, &hsize, NULL);
CloseHandle(hplik);
niestety problem pojawia sie teraz w Findresource a dokladniej "MAKEINTRESOURCE(142)" po prostu nie chce sie zaladowac ten obrazek o ID 142, prubowalem tez zamiast tego MAKEINTRESOURCE(142) wpisac po prostu IDR_OBRAZ1 (mÓj obrazek w zasobach) oraz prubowalm go wpiszac w nawiasy zamiast 142
w wyniku tego res zwraca mi wartosc 0
macie jakies pomysly jak to rozwiazac?? :-( :-( :-( :-(
Jeze;o obrazek jest zapisany w zasobach jako IDR_OBRAZ1 to uzyj MAKEINTRESOURCE(IDR_OBRAZ1)
juz prubowalem :-(
macie jeszcze jakies inne pomysly, moze jakies przeozenia robie :/
Pokreciles to troche, zapisujesz do pliku nie to co trzeba. Musisz uzyc LockResource zeby pobrac dane do zapisania.
Sprobuj tak:
BYTE *data;
DWORD c;
data=LockResource(hres);
WriteFile(hplik,data,hsize,&c,NULL);
CloseHandle(hplik);
No i oczywiscie nie:
res = FindResource(NULL, MAKEINTRESOURCE(142), RT_RCDATA);
...tylko:
res = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(142), RT_RCDATA);
Jako pierwszy parametr musisz podac HInstance exeka z zasobami.
I jeszcze jedna sprawa, zdaje sie, ze w windowsach starszych niz 2000 jest jakies ograniczenie co do rozmiaru zasobów, takze jezeli chcesz zeby program dzialal w np w WinMe/98 to pakowanie duzych obrazkow do exeka nie jest dobrym pomyslem.
surex napisał(a)
mam pewien obrazek w zasobach i nie wiem jak go "wypakowac" z programu do okreslonego katalogu
dla jasnosci programuje w Microsoft visual c++ v5.0
Masz go w zasobach jako Bitmap, RCdata, czy jeszcze może jeszcze inaczej (np. jako dialog :-D )?
ok....dzieki tobie teraz wypakowuje mi ten plik
niestety nie moge sie uwolnic od pecha i znowu cos nie gra [glowa] [glowa] [glowa]
oto zmodyfikowany kod:
HRSRC res;
HGLOBAL hres;
DWORD hsize;
HANDLE hplik;
HGLOBAL data; //musialem zmienic typ zmiennej bo cos muj kompilator nie chcial przysoic sobie BYTE
DWORD c;
res = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(142), RT_BITMAP);
if(res == 0) MessageBox("BŁĄD res", "error", MB_OK);
hres = LoadResource(NULL, res);
if(hres == NULL) MessageBox("BŁĄD hres", "error", MB_OK);
hsize = SizeofResource(NULL, res);
data=LockResource(hres);
hplik = CreateFile("c:\\plik.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
data=LockResource(hres);
WriteFile(hplik,data,hsize,&c,NULL);
CloseHandle(hplik);
problem polega na tym ze jak juz mi sie ten obrazek wypakuje to nie chce sie otworzyc :/
zaglądnołem za pomoca notanika do niego i zauwarzylem ze brakuje danych wpliku tzn na poczatku nie bylo paru bajtów i kawalek dalej zobaczylem ze niekture bajty sa zmienione
oto plik ktury dodaje do zasobów
http://surexeasy.w.interia.pl/cos/background1.bmp
a oto ten sam plik ktury zostal wypakowany z programu
http://surexeasy.w.interia.pl/cos/plik.bmp
problem juz nieaktualny :>
nareszcie rozwiazalem problem :-) :-) :-) :-) :-) :-)
thx za pomoc, gdyby nie wy to bym sobie nie poradził [!!!] [!!!] [!!!] [!!!] [!!!]
Bitmapa w zasobach nie ma nagłówka takiego jak pliki bmp,
jest tam od razu struktura BITMAPINFO.
HANDLE hres = LoadResource...
BITMAPINFO *data = LockResource(hbmp);
BITMAPFILEHEADER fh; // to trzeba zapisać na początku pliku
ZeroMemory(&fh, sizeof(fh));
fh.bfType = 'B' | 'M' >> 8; // tekst 'BM'
fh.bfSize = sizeof(fh) + sizedata;
bf.bfOffBits = sizeof(bf) + sizeof(BITMAPINFOHEADER) + 4*kolory
// kolory = liczba kolorów w tabeli data->rgbColors,
// czyli data->biClrUsed, ale jeśli jest to = 0, trzeba liczyć z bitów/kolor