windows - lockResource () returnerer en pointer, men til en ukendt struktur

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder med Visual Studio 2003 på Windows 7.


Jeg forsøger at indlejre en binær fil i en Windows Console applikation (c ++).
Jeg tilføjede i ressourceskriptet (.rc-filen) følgende linje:


SampleFile RCDATA  "c:\sample.zip"


og tilføjede også følgende kode for at få adgang til filen:


HRSRC hResource = FindResource(NULL, (LPCSTR)"SampleFile", RT\_RCDATA);
LPVOID l = LockResource(hResource);


nu er hResource et gyldigt håndtag, og LockResource lykkes også, men pegeren l peger på nogle strukturer, sandsynligvis et overskrift, der efterfølges af de faktiske data i zip-filen, jeg forsøgte at integrere.
Det lykkedes mig at se, at den anden DWORD i den nævnte overskrift er størrelsen på filen, og ressourternes navn ('SampleFile') vises også i overskriften, men kunne ikke finde en beskrivelse af overskriften eller ved mindst overskriftsstørrelsen.

Bedste reference


Som Luke sagde, mangler du et LoadResource() opkald i midten.


FindResource() giver i det væsentlige en peger/håndtag til ressourceoverskriften, LoadResource() læser den overskrift og giver dig en værdi, der (på win32) peger på selve dataene, men plejede at være en HGlobal, der kunne være flyttet i hukommelsen. Du vil så låse denne placering og få en pointer ved hjælp af LockResource().


Brugen forbliver den samme på Win32 dog.


Fra MSDN [8]



  Forsøg ikke at låse en ressource ved at bruge håndtaget, der returneres af FindResource eller FindResourceEx-funktionen. Et sådant håndtag peger på tilfældige data.



Resource header beskrives i MSDN som den fiktive RESOURCEHEADER struktur. [9]


Dette svar er stort set taget fra Raymond Chens artikel om 16-bit ressourceforvaltning [10]

Andre referencer 1


Du har en Api-funktion for at få størrelsen på ressource SizeofResource.

Pegeren peger til begyndelsen af ​​filen tilføjet som ressource (i dit tilfælde 'c: \ sample.zip).
Hvis du vil, kan du passere markøren til et ukomprimeret bibliotek eller bare skrive til disk. [11]

Andre referencer 2


Tak for hjælpen.
Faktisk havde jeg LoadResource i min kode, som gik tabt i kopien indsæt til webstedet.
Men det er relateret til problemet i min kode.
Koden så sådan ud: (Psuedo kode denne gang)
HANDLE hFindHandle=FindResource (...);
LoadResource (hFindHandle og Module Handle);
og så
LPVOID l=LockResource (hFindHandle);


Jeg brugte ikke den returnerede værdi fra LoadResource, men blev ved med at bruge den fra FindResource, så selvom jeg kaldte LoadResource, fik jeg ikke den korrekte pointer fra LockResource.