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