www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Resource File Accessing

reply Plumm <sailormoontw gmail.com> writes:
Hi :

   I would like to include a binary file about 64K in my exe to make it a
single executable file, any tip how to make the resouce file? compile the
resource file, and how to access it in the D program? And since I use DWT, I
already linked my program with a dwt.res got from Frank, should I ask Frank for
the rc file so that I can append the binary file into the rc file? 

Thanks
Dec 27 2008
next sibling parent reply "Jarrett Billingsley" <jarrett.billingsley gmail.com> writes:
On Sat, Dec 27, 2008 at 11:33 PM, Plumm <sailormoontw gmail.com> wrote:
 Hi :

   I would like to include a binary file about 64K in my exe to make it a
single executable file, any tip how to make the resouce file? compile the
resource file, and how to access it in the D program? And since I use DWT, I
already linked my program with a dwt.res got from Frank, should I ask Frank for
the rc file so that I can append the binary file into the rc file?

 Thanks

Easier even than that. The import() expression allows you to include arbitrary data in your app. const data = cast(byte[])import("filename.dat"); All you have to do is pass the -J flag to DMD to indicate the path where filename.dat lives. import() returns a string (a char[]) but you can cast it to whatever type you want, like I've casted to byte[] here. :)
Dec 27 2008
next sibling parent "Nick Sabalausky" <a a.a> writes:
"Jarrett Billingsley" <jarrett.billingsley gmail.com> wrote in message 
news:mailman.272.1230439483.22690.digitalmars-d puremagic.com...
 On Sat, Dec 27, 2008 at 11:33 PM, Plumm <sailormoontw gmail.com> wrote:
 Hi :

   I would like to include a binary file about 64K in my exe to make it a 
 single executable file, any tip how to make the resouce file? compile the 
 resource file, and how to access it in the D program? And since I use 
 DWT, I already linked my program with a dwt.res got from Frank, should I 
 ask Frank for the rc file so that I can append the binary file into the 
 rc file?

 Thanks

Easier even than that. The import() expression allows you to include arbitrary data in your app. const data = cast(byte[])import("filename.dat"); All you have to do is pass the -J flag to DMD to indicate the path where filename.dat lives. import() returns a string (a char[]) but you can cast it to whatever type you want, like I've casted to byte[] here. :)

That would have been great to have back when I was doing GBA homebrew. We used to use separate util apps to convert data files into ".h" includes.
Dec 27 2008
prev sibling next sibling parent reply Daniel Keep <daniel.keep.lists gmail.com> writes:
Jarrett Billingsley wrote:
 On Sat, Dec 27, 2008 at 11:33 PM, Plumm <sailormoontw gmail.com> wrote:
 Hi :

   I would like to include a binary file about 64K in my exe to make it a
single executable file, any tip how to make the resouce file? compile the
resource file, and how to access it in the D program? And since I use DWT, I
already linked my program with a dwt.res got from Frank, should I ask Frank for
the rc file so that I can append the binary file into the rc file?

 Thanks

Easier even than that. The import() expression allows you to include arbitrary data in your app. const data = cast(byte[])import("filename.dat"); All you have to do is pass the -J flag to DMD to indicate the path where filename.dat lives. import() returns a string (a char[]) but you can cast it to whatever type you want, like I've casted to byte[] here. :)

That's pretty much the cleanest solution there is. Another trick I've used in the past is to simply append the extra data to the executable. At least under Windows, this doesn't affect the program at all. If the binary data isn't a fixed size, you can also append a small stub that specifies how big the file is. Then, the file's contents start at (eof - stub_size - data_size) within the program's own executable. Really, the only advantage to this over using import() is that you can change the data post-compilation (I've used this trick for a script interpreter which "compiled" scripts into a standalone executable.) -- Daniel
Dec 28 2008
parent reply Andrei Alexandrescu <SeeWebsiteForEmail erdani.org> writes:
Daniel Keep wrote:
 
 
 Jarrett Billingsley wrote:
 On Sat, Dec 27, 2008 at 11:33 PM, Plumm <sailormoontw gmail.com> wrote:
 Hi :

   I would like to include a binary file about 64K in my exe to make 
 it a single executable file, any tip how to make the resouce file? 
 compile the resource file, and how to access it in the D program? And 
 since I use DWT, I already linked my program with a dwt.res got from 
 Frank, should I ask Frank for the rc file so that I can append the 
 binary file into the rc file?

 Thanks

Easier even than that. The import() expression allows you to include arbitrary data in your app. const data = cast(byte[])import("filename.dat"); All you have to do is pass the -J flag to DMD to indicate the path where filename.dat lives. import() returns a string (a char[]) but you can cast it to whatever type you want, like I've casted to byte[] here. :)

That's pretty much the cleanest solution there is.

Please allow me to grab credit for that one :o). Andrei
Dec 28 2008
parent "Lionello Lunesu" <lionello lunesu.remove.com> writes:
--snip--
 All you have to do is pass the -J flag to DMD to indicate the path
 where filename.dat lives.  import() returns a string (a char[]) but
 you can cast it to whatever type you want, like I've casted to byte[]
 here.  :)

That's pretty much the cleanest solution there is.

Please allow me to grab credit for that one :o).

But shouldn't it return a void[] or byte[] by default? If it's known to be UTF8, then it can be cast to char[] explicitely. L.
Dec 28 2008
prev sibling parent Plummtw <sailormoontw gmail.com> writes:
Jarrett Billingsley Wrote:
 Easier even than that.  The import() expression allows you to include
 arbitrary data in your app.
 
 const data = cast(byte[])import("filename.dat");
 
 All you have to do is pass the -J flag to DMD to indicate the path
 where filename.dat lives.  import() returns a string (a char[]) but
 you can cast it to whatever type you want, like I've casted to byte[]
 here.  :)

Dec 28 2008
prev sibling parent "Bill Baxter" <wbaxter gmail.com> writes:
On Mon, Dec 29, 2008 at 1:42 PM, Lionello Lunesu
<lionello lunesu.remove.com> wrote:
 --snip--
 All you have to do is pass the -J flag to DMD to indicate the path
 where filename.dat lives.  import() returns a string (a char[]) but
 you can cast it to whatever type you want, like I've casted to byte[]
 here.  :)

That's pretty much the cleanest solution there is.

Please allow me to grab credit for that one :o).

But shouldn't it return a void[] or byte[] by default? If it's known to be UTF8, then it can be cast to char[] explicitely.

Yes. http://d.puremagic.com/issues/show_bug.cgi?id=1985 --bb
Dec 28 2008