Citire fisier din resurse

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
danna
Membru
Membru
Posts: 62
Joined: 25 Jul 2007, 10:02

Citire fisier din resurse

Post by danna » 01 Aug 2007, 09:04

As vrea sa fac urmatorul lucru: in loc sa distribui niste fisiere cu aplicatia mea, sa le adaug la resurse, si sa le citesc cumva din executabil la run-time? Se poate asa ceva? Daca da, cum? E vorba de fisiere binare.

PS: Sper ca m-am facut inteleasa.



Viorel
Microsoft MVP
Microsoft MVP
Posts: 292
Joined: 13 Jul 2007, 12:26

Re: Citire fisier din resurse

Post by Viorel » 01 Aug 2007, 09:27

Dacă te descurci cu adăugarea fişierului binar la resursele programului, astfel încît fişierul .rc să conţină o linie de tipul:

Code: Select all

. . .
IDR_DATE1 DATE "FisierDeDate.bin"
. . .
atunci accesul se va efectua în modul următor:

Code: Select all

HRSRC hr = ::FindResource(NULL, MAKEINTRESOURCE(IDR_DATE1), _T("DATE"));
HGLOBAL hg = ::LoadResource(NULL, hr);
LPVOID ptr = ::LockResource(hg);

. . .

::UnlockResource(hg);
::FreeResource(hg);
Datele binare sînt accesibile prin intermediul pointerului ptr între LockResource şi UnlockResource. Dimensiunea datelor poate fi aflată cu ajutorul funcţiei SizeofResource.

Sper să funcţioneze.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Citire fisier din resurse

Post by Ovidiu Cucu » 05 Aug 2007, 13:49

Salut danna,

Pe langa ceea ce deja a raspuns Viorel am de adaugat o observatie putin "pe langa"...

Idea de a "distribui" fisiere in resursele aplicatiei este absolut nepractica.
In primul rand "umfli" aplicatia cu date care dupa ce le-ai "extras" nu mai au ce cauta degeaba "in memorie".
In al doilea rand, de fiecare data cand ai de facut o modificare trebuie sa umbli in cod / resurse.

O metoda mai practica este cea folosita la asazisele arhive SFX (self-extracting archives).
Se porneste de la un executabil de baza la care pur si simplu adaugi "in coada" ce vrea mushchii tai, de exemplu continutul compresat sau nu, al acelor fisiere binare pe care vrei sa le "redistribui" in mod compact.
Executabilul de baza contine tocmai codul de "extragere" a fisierelor. Mai avem nevoie de un camp care sa ne dea offset-ul, locul unde se termina executabilul si incep datele si eventual de un "header", o structura care sa-mi descrie componenta blocului de date.

Well, ca sa nu ma lungesc cu explicatiile in poza de jos e o schema simplificata a strucuturii unei arhive SFX
sfx_archive.gif
sfx_archive.gif (6.04 KiB) Viewed 3060 times
// ma chinuie si pe mine talentul la desen :). Oricum, sper ca se intelege ce si cum.

danna
Membru
Membru
Posts: 62
Joined: 25 Jul 2007, 10:02

Re: Citire fisier din resurse

Post by danna » 05 Aug 2007, 19:17

Ovidiu, si cum folosesc sfx-urile astea?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Citire fisier din resurse

Post by Ovidiu Cucu » 05 Aug 2007, 20:15

Ca pe orice executabil. Dublu-click din explorer sau din program cu CreateProcess, ShellExecute, ShellExecuteEx, _spawn, etc.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Citire fisier din resurse

Post by Ovidiu Cucu » 05 Aug 2007, 20:52

Ah... uitam!
Nu cum il folosesti e mai dificil, dupa cum ii spune si numele ar trebui, odata ce-l lansezi sa stie el singur sa-si faca treaba.
Mai greu e sa-l faci.
Dar nici asta nu-i un capat de lume...
In primul rand ar trebui sa faci acel executabil de baza de care vorbeam mai inainte. Ala ar trebui sa stie cum sa gaseasca headerul (bazar pe acel offset) si apoi avand informatiile din header pur si simplu sa rashneasca sa extraga si sa salveze fisierele la locul corespunzator. Il faci il compilezi si-l pui la pastrare la loc sigur.
De-aici incepe partea frumoasa: o mica scula de facut efectiv arhiva SFX, de preferinta cat mai "visuala".
Cand ai terminat-o si pe asta, gata... poti intra la concurenta cu WinRAR, WinZip, si multe alte scule cool de care-i plina lumea... :)

Post Reply