PHP WinBinder 2: Resource
PHP WinBinder 2 : Introduction | WinBinder portable | Add code | PHC-Win | Resource
|
|
UniServer 5-Nano PHP WinBinder 2. |
WinBinder Part 2 PHC-Win Resources
On the previous page I mentioned image duplication. We included individual images with our distribution package however PHC-Win adds these to the final exe file.
Without making code changes these image resources are not directly accessible by WinBinder hence the reason for adding them to our distribution package.
This page looks at code changes required to use images contained within the exe file thus eliminating the need for separately including them with the distribution package.
Embeder overview
The embeder creates an executable file where additional files may be added.
These files are added to an array named PHP, array keys are md5 encoded a resource file is accessible via it’s key.
Running tis executable a unique constant is created named EMBEDED
It’s worth looking at the mechanics of this process.
Setup
|
test.bat embeder2.exe new test2 embeder2.exe add test2 red.bmp ./ embeder2.exe list test2 pause | |
Batch file
Run batch file Run the batch file test.bat result shown on the right. Note: The md5 is converted to uppercase before being saved to the array. File (resource) access
|
Result C:\us_wb\phc>embeder2.exe new test2 '.\test2.exe' created C:\us_wb\phc>embeder2.exe add test2 red.bmp ./ Updated 'res://.\test2.exe/PHP/0374ec857381230fa83049643ce3cdee' with 776 bytes C:\us_wb\phc>embeder2.exe list test2 Res list of '.\test2.exe': PHP 0374EC857381230FA83049643CE3CDEE RUN RT_ICON #1 #2 RT_GROUP_ICON #101 #24 C:\us_wb\phc>pause Press any key to continue . . . |
Problem
Our application uses the following code to assign images :
wb_set_image(wb_get_control($mainwin, IDC_FRAMERED1),'red.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMERED2), 'red.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMEGREEN1),'green.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMEGREEN2),'green.bmp', NOCOLOR); wb_set_image($mainwin, "uslogo.ico"); // Add logo |
The above functions are expecting an image file path.
This code res:///PHP/'.strtoupper(md5('./red.exe')) returns an image resource, binary content of a file.
The two are incompatible hence WinBinder cannot use an image resource directly.
Solution
Solution as follows:
- Write the image resource to a file on disk
- Allow WinBinder to assign this image file (using it's path)
- Once assigned is no longer required hence delete image file
Code
Code splits into three sections.
- First section tests if code is running from the exe using EMBEDED as a reference. If running from exe gets the image resource as a file and saves it to disk with original file name.
- Second section contains original lines that remain unchanged.
- Last section tests if code is running from the exe and deletes file from disk if true.
This method allows code to be tested with original images. After compiling the exe produced is moved to folder C:\us_wb\my_dis\final for testing.
If code is running from exe (EMBEDED true) get resource as a file and save to disk with same file name.. |
// Assign red image to frames if(defined('EMBEDED')){ // If main exe Get image save to disk file_put_contents('./red.bmp',file_get_contents('res:///PHP/'.strtoupper(md5('./red.bmp')))); } |
These lines remain unchanged. |
wb_set_image(wb_get_control($mainwin, IDC_FRAMERED1),'red.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMERED2), 'red.bmp', NOCOLOR); |
If running from exe image no longer required hence delete. |
if(defined('EMBEDED')){ // If main exe unlink('./red.bmp'); // Delete file } |
With the exception of image name each image requires identical code.
Modifications
Edit file C:\us_wb\my_app\z_basic.phpw Replace these lines
// Assign images to frames wb_set_image(wb_get_control($mainwin, IDC_FRAMERED1),'red.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMEGREEN1),'green.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMERED2), 'red.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMEGREEN2),'green.bmp', NOCOLOR);
With
// Assign red image to frames if(defined('EMBEDED')){ // If main exe Get image save to disk file_put_contents('./red.bmp',file_get_contents('res:///PHP/'.strtoupper(md5('./red.bmp')))); } wb_set_image(wb_get_control($mainwin, IDC_FRAMERED1),'red.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMERED2), 'red.bmp', NOCOLOR); if(defined('EMBEDED')){ // If main exe unlink('./red.bmp'); // Delete file } // Assign green image to frames if(defined('EMBEDED')){ // If main exe Get image save to disk file_put_contents('./green.bmp',file_get_contents('res:///PHP/'.strtoupper(md5('./green.bmp')))); } wb_set_image(wb_get_control($mainwin, IDC_FRAMEGREEN1), 'green.bmp', NOCOLOR); wb_set_image(wb_get_control($mainwin, IDC_FRAMEGREEN2), 'green.bmp', NOCOLOR); if(defined('EMBEDED')){ // If main exe unlink('./green.bmp'); // Delete file }
Replace this line
wb_set_image($mainwin, "uslogo.ico"); // Add logo
With
// Assign logo image to window if(defined('EMBEDED')){ // If main exe Get image save to disk file_put_contents('./uslogo.ico',file_get_contents('res:///PHP/'.strtoupper(md5('./uslogo.ico')))); } wb_set_image($mainwin, "uslogo.ico"); // Add logo if(defined('EMBEDED')){ // If main exe unlink('./uslogo.ico'); // Delete file }
Test
- Run z_basic.bat ensure your application runs
- Compile
- Copy z_basic.exe to folder C:\us_wb\my_dis\final
- Optional delete image files. (Note images will be deleted when z_basic.exe is run)
- Run z_basic.exe
Summary
That completes this tutorial.
To save typing you can find a completed project ready for compiling in folder C:\us_wb\phc\us_example copy all files to folder C:\us_wb\my_app compile and test as above.
Conclusion
- Designing a Windows application using WinBinder is extremely easy.
- Compiling a project with PHC-Win really is a snip, takes just a few mouse clicks.
- Being slightly negative for a small Windows application the distributed code size is relatively large. This is not a significant issue, havening the connivance and ease of use of PHP far out ways this.
- That said core elements of WinBinder are being actively worked on. Both Andrew (Frantik) and Alec Gorge “alecgorge” are pushing to reduce core size further expect significant changes.
- The WinBinder project remains alive and vibrant. What I really like, you can produce very powerful Windows applications using these tools. Project is well supported and you will find numerous code examples.
- If you get stuck with a problem visit WinBinder’s friendly forum.