DEV Community

Gurigraphics
Gurigraphics

Posted on

Embedding Files in an Executable - Icons & Details - Part 6

How change icon, file details and load a file.txt from resources?

1) Create a simple window:

main.cpp

#include <windows.h> #include <iostream>  LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); wc.lpszClassName = TEXT("MyWindowClass"); if (!RegisterClass(&wc)) return 1; HWND hwnd = CreateWindow( TEXT("MyWindowClass"), TEXT( "My window" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg){ case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } 
Enter fullscreen mode Exit fullscreen mode

2) Compile

g++ main.cpp -o main.exe && main 
Enter fullscreen mode Exit fullscreen mode

4) Download 1 or 2 files: favicon.ico

https://favicon.io/emoji-favicons/

5) Create a file: data.txt

My window name 
Enter fullscreen mode Exit fullscreen mode

6) Create resource.h

#define IDI_MYICON 101 #define TEXTFILE 256 #define IDR_DATA1 255  void LoadFileInResource(int name, int type, DWORD& size, const wchar_t*& data){ HMODULE handle = ::GetModuleHandleW(NULL); HRSRC rc = ::FindResourceW(handle, MAKEINTRESOURCEW(name), MAKEINTRESOURCEW(type)); HGLOBAL rcData = ::LoadResource(handle, rc); size = ::SizeofResource(handle, rc); data = static_cast<const wchar_t*>(::LockResource(rcData)); } std::string GetResource(){ DWORD size = 0; const char* data = NULL; LoadFileInResource(IDR_DATA1, TEXTFILE, size, reinterpret_cast<const wchar_t*&>(data)); std::string content(data, size); return content; } 
Enter fullscreen mode Exit fullscreen mode

7) Create resource.rc

#include <windows.h> #include "resource.h" IDI_MYICON ICON "favicon.ico" IDR_DATA1 TEXTFILE "data.txt" VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "CompanyName" VALUE "LegalCopyright", "(c) CompanyName. All Rights reserved." VALUE "ProductName", "ProductName35" VALUE "ProductVersion", "1,0,0,1" VALUE "FileDescription", "ProductName" VALUE "InternalName", "ProductName" VALUE "OriginalFilename", "main.exe" VALUE "ShellIntegrationVersion", "2" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0416, 1200 END END 
Enter fullscreen mode Exit fullscreen mode

8) Generate resource.res

In Windows

windres.exe -i "resource.rc" --input-format=rc -o "resource.res" -O coff 
Enter fullscreen mode Exit fullscreen mode

In Linux/WSL2

x86_64-w64-mingw32-windres resource.rc -O coff -o resource.o -I/usr/share/mingw-w64/include 
Enter fullscreen mode Exit fullscreen mode

9) Adding icons in window:

Print in console data.txt content:

std::cout << GetResource(); 
Enter fullscreen mode Exit fullscreen mode

Display window name:

TEXT( GetResource().c_str() ) 
Enter fullscreen mode Exit fullscreen mode

Load icon:

wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON)); 
Enter fullscreen mode Exit fullscreen mode

Set icons:

SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON))); SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON))); 
Enter fullscreen mode Exit fullscreen mode

Destroy icons:

DestroyIcon((HICON)SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0)); DestroyIcon((HICON)SendMessage(hwnd, WM_GETICON, ICON_BIG, 0)); 
Enter fullscreen mode Exit fullscreen mode

main.cpp

#include <windows.h> #include <iostream> #include "resource.h"  LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ std::cout << GetResource(); WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); wc.lpszClassName = TEXT("MyWindowClass"); wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON)); if (!RegisterClass(&wc)) return 1; HWND hwnd = CreateWindow( TEXT("MyWindowClass"), TEXT( GetResource().c_str() ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); // Set icon SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON))); SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON))); ShowWindow(hwnd, nCmdShow); MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } // Free icon DestroyIcon((HICON)SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0)); DestroyIcon((HICON)SendMessage(hwnd, WM_GETICON, ICON_BIG, 0)); return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg){ case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } 
Enter fullscreen mode Exit fullscreen mode

10) Compile

In Windows

g++ main.cpp -o main.exe resource.res 
Enter fullscreen mode Exit fullscreen mode

In Linux/WSL2

x86_64-w64-mingw32-g++ main.cpp resource.o -o main.exe -static-libgcc -static-libstdc++ -I/usr/share/mingw-w64/include 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)