odczyt pliku z zasobów programu

0

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

0

jezeli masz go w skompilowanym exeku to sprobuj programu resource hacker (obecnie funkcjonuje pod inna nazwa).

0

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

0

Poczytaj o:

  • FindResource
  • LoadResource
  • SizeofResource
  • LockResource
0

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?? :-( :-( :-( :-(

0

Jeze;o obrazek jest zapisany w zasobach jako IDR_OBRAZ1 to uzyj MAKEINTRESOURCE(IDR_OBRAZ1)

0

juz prubowalem :-(
macie jeszcze jakies inne pomysly, moze jakies przeozenia robie :/

0

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.

0
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 )?

0

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

0

problem juz nieaktualny :>
nareszcie rozwiazalem problem :-) :-) :-) :-) :-) :-)
thx za pomoc, gdyby nie wy to bym sobie nie poradził [!!!] [!!!] [!!!] [!!!] [!!!]

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1