/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Datafilerne ind i .exe´n
Fra : Klaus Petersen


Dato : 26-10-02 23:38

Hej NG.

Jeg har lavet en lille grafisk demo, som bruger nogle data filer (wave
filer, hjemmelavet data filer, m.m.).

Jeg kunne godt tænke mig, at disse datafiler blev pakket med ind i .exe
filens resourcer, således at demoen kun bestod af en enkelt fil.

Men kan man putte hvad som helst ind i resourcerne og hvordan kan man få
adgang til filerne mens programmet kører, så man kan bruge dem til hvad de
nu bruges til?

Jeg bruger Visual C++ 6.0.

Klaus.



 
 
Bo Simonsen (27-10-2002)
Kommentar
Fra : Bo Simonsen


Dato : 27-10-02 00:03

Klaus Petersen wrote:
> Hej NG.
>
> Jeg har lavet en lille grafisk demo, som bruger nogle data filer (wave
> filer, hjemmelavet data filer, m.m.).
>
> Jeg kunne godt tænke mig, at disse datafiler blev pakket med ind i .exe
> filens resourcer, således at demoen kun bestod af en enkelt fil.

Jeg kan huske man kunne gøre det med Winzip.

--
Mvh. Bo
Linux! The choice of a GNU generation!


Kristian Risager Lar~ (27-10-2002)
Kommentar
Fra : Kristian Risager Lar~


Dato : 27-10-02 05:31


> > Jeg kunne godt tænke mig, at disse datafiler blev pakket med ind i .exe
> > filens resourcer, således at demoen kun bestod af en enkelt fil.
>
> Jeg kan huske man kunne gøre det med Winzip.

Saa bliver det en selvudpakkende exe-fil.
Jeg tror Klaus Petersen oensker at pakke sine multimediefiler ind i den
exe-fil der skal koere demoen.

--
Kristian Risager Larsen - Udvekslingsstudent i USA - http://kezze.dk/usa/




Bertel Lund Hansen (27-10-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 27-10-02 09:30

Kristian Risager Larsen skrev:

>Jeg tror Klaus Petersen oensker at pakke sine multimediefiler ind i den
>exe-fil der skal koere demoen.

Det tror jeg du har ret i. I praksis opnår man næsten det samme
med et pakkeprogram (som jo alligevel skulle bruges - hvem sender
upakkede filer?).

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Klaus Petersen (27-10-2002)
Kommentar
Fra : Klaus Petersen


Dato : 27-10-02 13:08

> hvem sender upakkede filer?).

Det ender det også med. Men den måde jeg har tænkt mig at gøre det på er, at
bruge et ligge program jeg har liggende, der kan lave en alm. ukomprimeret
..exe om til en .exe, der udpakker sig selv inden den køres (lidt a lá de
gamle amiga/c64 demoer hvis nogen kan huske dem).



Kristian Risager Lar~ (27-10-2002)
Kommentar
Fra : Kristian Risager Lar~


Dato : 27-10-02 20:17

> Det ender det også med. Men den måde jeg har tænkt mig at gøre det på er,
at
> bruge et ligge program jeg har liggende, der kan lave en alm. ukomprimeret
> .exe om til en .exe, der udpakker sig selv inden den køres (lidt a lá de
> gamle amiga/c64 demoer hvis nogen kan huske dem).

Ja, det var netop hvad jeg tænkte på.

--
Kristian Risager Larsen - Udvekslingsstudent i USA - http://kezze.dk/usa/




Peter Bødskov (27-10-2002)
Kommentar
Fra : Peter Bødskov


Dato : 27-10-02 10:04

"Klaus Petersen" <spektual@hotmail.com> skrev i en meddelelse
news:apf5fc$3nd$1@sunsite.dk...
> Hej NG.
>
> Jeg har lavet en lille grafisk demo, som bruger nogle data filer (wave
> filer, hjemmelavet data filer, m.m.).
>
> Jeg kunne godt tænke mig, at disse datafiler blev pakket med ind i .exe
> filens resourcer, således at demoen kun bestod af en enkelt fil.
>
> Jeg bruger Visual C++ 6.0.
>
> Klaus.
>
Hej Klaus

Prøv at tage et kig på nehes fine fine hjemmeside. Tutorial nr 38 forklarer
hvordan man bruger resource filer med Visual C++ 6.0.

Adressen er:

http://nehe.gamedev.net/

Håber du kan bruge det.

--
--
Venlig hilsen

Peter



Morten F. Hansen (27-10-2002)
Kommentar
Fra : Morten F. Hansen


Dato : 27-10-02 11:35

"Klaus Petersen" wrote:
> Jeg har lavet en lille grafisk demo, som bruger nogle data filer (wave
> filer, hjemmelavet data filer, m.m.).
> Jeg kunne godt tænke mig, at disse datafiler blev pakket med ind i .exe
> filens resourcer, således at demoen kun bestod af en enkelt fil.

Man kan jo også gøre det manuelt (og platform uafhængigt) med et array:

////////////////////
// Private data //
////////////////////

static const int resource_length = 12422;

static const unsigned char resource_data[length] = {
128, 128, 132, 150, 244, 132, 86,
.
.
.
};

///////////////////////////////
// Public access functions //
///////////////////////////////

int GetWaveResourceLength()
{
return resource_length;
}

unsigned char *GetWaveResourcePtr()
{
return wave_resource;
}

Så kan man jo skrive et lille utility-program, som laver en data-fil på
disken om til en .cpp/.h fil som ovenstående.



Ulrik Magnusson (27-10-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 27-10-02 11:54

Klaus Petersen wrote:

> Hej NG.
>
> Jeg har lavet en lille grafisk demo, som bruger nogle data filer (wave
> filer, hjemmelavet data filer, m.m.).
>
> Jeg kunne godt tænke mig, at disse datafiler blev pakket med ind i .exe
> filens resourcer, således at demoen kun bestod af en enkelt fil.
>
> Men kan man putte hvad som helst ind i resourcerne og hvordan kan man få
> adgang til filerne mens programmet kører, så man kan bruge dem til hvad de
> nu bruges til?
>
> Jeg bruger Visual C++ 6.0.

WAVE:
Højreklik på resources, vælg import og find filen.
Så kan du spille den med følgende:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),NULL,SND_RESOURCE | SND_ASYNC);
(IDR_WAVE1 skal måske skiftes ud).
For at dette virker skal du #include "mmsystem.h" og
tilføje winmm.lib under Project->Settings->Link->
Object/library modules.

Andet:
Højreklik på resources, vælg import og find filen. Giv resourcetypen
et navn og resourcen et navn.

find, load, lock, use, free:

HRSRC hResInfo = FindResource( hInstance, TEXT( "MY_RES_TYPE" ),
MAKEINTRESOURCE( "MY_RES_NAME" ) );
HGLOBAL hResource = LoadResource( hInstance, hResInfo ) ;

//LockResource() returnerer en pointer til dine data fra filen, som så kan
// være hvad som helst. Vi siger bare at det er en streng og popper up:
// LockResource() loader dine data, hvis de ikke allerede er i hukommelsen.
char* data = (char*)LockResource( hResource ); // load file
AfxMessageBox( data );

//og frigiver hukommelsen:
FreeResource( hResource );


Ulrik Magnusson


Ulrik Magnusson (27-10-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 27-10-02 13:32


Ulrik Magnusson wrote:

> HRSRC hResInfo = FindResource( hInstance, TEXT( "MY_RES_TYPE" ),
> MAKEINTRESOURCE( "MY_RES_NAME" ) );

og så virker det endda, hvis man tænker sig om og i stedet skriver:

HRSRC hResInfo = FindResource( hInstance, MAKEINTRESOURCE( MY_RES_NAME ),
TEXT( "MY_RES_TYPE" ) );


Ulrik Magnusson


Klaus Petersen (27-10-2002)
Kommentar
Fra : Klaus Petersen


Dato : 27-10-02 15:56

> HRSRC hResInfo = FindResource( hInstance, TEXT( "MY_RES_TYPE" ),
> MAKEINTRESOURCE( "MY_RES_NAME" ) );

Idéen er god - men du skriver det forkert.

Resourcenavnet er parameter 2 og ikke 3 - og resourcetypen er parameter 3 og
ikke 2.
Desuden lægger du op til at MAKEINTRESOURCE tager en const char, hvilket
heller ikke er rigtigt. Den skal have en LONG konstant, som er defineret
inde i resource.h (det tricky er, at man ingen fejl får ved at give den et
char array)

> //LockResource() returnerer en pointer til dine data fra filen, som så kan
> // være hvad som helst. Vi siger bare at det er en streng og popper up:
> // LockResource() loader dine data, hvis de ikke allerede er i
hukommelsen.

Jeg har nogle problemer med LockResource ... den returnerer NULL ved mine
wave filer og GetLastError returnerner i den forbindelse også 0...
så hvad er der i galt?

Jeg har læst et sted, at LockResource returnerer NULL i tilfælde af, at
resourcen er låst i forevejen - men hvis det er rigtigt, hvordan får man så
fat i en pointer til den? Unlockresource er jo forældet.

Skal for en god ordens skyld lige tilføje, at min wave filer afspilles med
directsound og ikke playsound og bliver parset af en funktion inde i
programmet (dvs. filerne skal importeres som RAW filer).

<CODE>

hResInfo = FindResource ( hInstance, MAKEINTRESOURCE ( Resnavn ), TEXT (
Typenavn ) );

err = GetLastError ();

if (hResInfo == NULL) {
FejlStr = FEJL_LoadSound4;
FejlNo = 0;
sprintf ( (char*)&FejlExt, "%d", err );
return false;
}

hResource = LoadResource( hInstance, hResInfo ) ;

if (hResource = NULL) {
FejlStr = FEJL_LoadSound5;
FejlNo = 0;
strcpy (FejlExt, "");
return false;
}

data = (char*)LockResource( hResource );
err = GetLastError ();

if (data == NULL) {
FejlStr = FEJL_LoadSound6;
FejlNo = 0;
sprintf ( (char*)&FejlExt, "%d", err );
return false;
}

dtaptr = 0;

memcpy ( &tmp, (void*)data [dtaptr], 4); dtaptr += 4;

if (tmp != 0x46464952) { // 0x46464952 == RIFF
FreeResource( hResource );
FejlStr = FEJL_FormatFejl;

// .... koden fortsætter i lange baner
</CODE>



Klaus Petersen (27-10-2002)
Kommentar
Fra : Klaus Petersen


Dato : 27-10-02 15:57

.. og mange tak for svaret forresten (duh..)



Ulrik Magnusson (27-10-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 27-10-02 16:15

Klaus Petersen wrote:

> > //LockResource() returnerer en pointer til dine data fra filen, som så kan
> > // være hvad som helst. Vi siger bare at det er en streng og popper up:
> > // LockResource() loader dine data, hvis de ikke allerede er i
> hukommelsen.
>
> Jeg har nogle problemer med LockResource ... den returnerer NULL ved mine
> wave filer og GetLastError returnerner i den forbindelse også 0...
> så hvad er der i galt?

<snip>

> if (hResource = NULL) {

AAARGHHH!! Gad vide om det ikke skulle løse problemet at
rette den linie..

Ulrik Magnusson


Klaus Petersen (27-10-2002)
Kommentar
Fra : Klaus Petersen


Dato : 27-10-02 16:21

> > if (hResource = NULL) {

DOOOOOOOOOOOOOOOOOH <ekko> dooooh.. dooh.. doh.. do.. </ekko>

(hehe.. nu kom den da videre - nu crasher den bare et sted i min parser
)



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste