Enumerating resource data in executable files

 

















HMODULE hModule_DLL;

 hModule_DLL = hModule;
 break;
















The following steps are to add four BMP files to MyBlog_Created_2024_11_17 project.





























































#pragma once
#ifdef MYCPPRESOURCE_EXPORTS
#define MYCPPRESOURCE_API __declspec(dllexport)
#else
#define MYCPPRESOURCE_API __declspec(dllimport)
#endif
extern "C" MYCPPRESOURCE_API BOOL FindResourceManifest(
LPCWSTR pFileName, LPCWSTR keyword2);
extern "C" MYCPPRESOURCE_API BOOL MyEnumResource(
LPCWSTR pFileName);
extern "C" MYCPPRESOURCE_API void MyDialog(HWND hWnd);





  1. #include "pch.h"
  2. #include "My_Cpp_Resource.h"
  3. #include "resource.h"
  4. #include <tchar.h>
  5. #include "shellapi.h"
  6. #include "Shlwapi.h"
  7. #include "pathcch.h"
  8. #include  "excpt.h"
  9. unsigned char BOM_UNICODE[2] = { 0XFF,0XFE };
  10. WCHAR  RT_Names[25][50] = {
  11. L"(0)",
  12. L"RT_CURSOR(1)",
  13. L"RT_BITMAP(2)",
  14. L"RT_ICON(3)",
  15. L"RT_MENU(4)",
  16. L"RT_DIALOG(5)",
  17. L"RT_STRING(6)",
  18. L"RT_FONTDIR(7)",
  19. L"RT_FONT(8)",
  20. L"RT_ACCELERATOR(9)",
  21. L"RT_RCDATA(10)",
  22. L"RT_MESSAGETABLE(11)",
  23. L"RT_GROUP_CURSOR(12)",
  24. L"(13)",
  25. L"RT_GROUP_ICON(14)",
  26. L"(15)",
  27. L"RT_VERSION(16)",
  28. L"RT_DLGINCLUDE(17)",
  29. L"(18)",
  30. L"RT_PLUGPLAY(19)",
  31. L"RT_VXD(20)",
  32. L"RT_ANICURSOR(21)",
  33. L"RT_ANIICON(22)",
  34. L"RT_HTML(23)",
  35. L"RT_MANIFEST(24)"
  36. };
  37. struct PNG_Image {
  38.     DWORD SizeOfPngResource;
  39.     LPVOID lpvoid_PNG;
  40. };
  41. PNG_Image MyPng_Image[20];
  42. int CountOf_PngImage;

  43. HFONT hFont;
  44. HDC hDC_memo;
  45. LPVOID lpLockManifest;
  46. DWORD SizeOfManifest;
  47. HWND hWnd;
  48. bool Found_Manifest_With_Keywords;
  49. const int size_filename = MAX_PATH;
  50. const int MaxSizeOfManifest = 8 << 20;
  51. char manifest[MaxSizeOfManifest];
  52. const size_t MaxSizeOfKeywords = 567;
  53. char keywords[MaxSizeOfKeywords];
  54. TCHAR BufferForEnumRes[3 << 20];
  55. TCHAR* pBuf_Start;
  56. DWORD cbWritten;

  57. BOOL CALLBACK EnumLangsFunc_Manifest(HMODULE hModule, LPCTSTR lpType, LPCTSTR lpName, WORD wLang,
  58.     LONG extra_parameter) {
  59.     HRSRC hResInfo = FindResourceEx(hModule, lpType, lpName, wLang);
  60.     if (hResInfo) {
  61.         HGLOBAL hGlobal = LoadResource(hModule, hResInfo);
  62.         if (hGlobal) {
  63.             lpLockManifest = LockResource(hGlobal);
  64.             SizeOfManifest = SizeofResource(hModule, hResInfo);
  65.             if (SizeOfManifest >= MaxSizeOfManifest) {
  66.                 WCHAR TMP[500];
  67.                 wsprintf(TMP, L"Size = %i (%i)", SizeOfManifest, MaxSizeOfManifest);
  68.                 MessageBoxW(nullptr, L"manifest too large", TMP, 0);
  69.                 return TRUE;
  70.             }
  71.             manifest[SizeOfManifest] = '\0';
  72.             char* pSource;
  73.             pSource = (char*)lpLockManifest;
  74.             for (unsigned i = 0; i < SizeOfManifest; i++) {
  75.                 manifest[i] = toupper(*pSource++);
  76.             }
  77.             pSource = keywords;
  78.             for (; *pSource; pSource++)*pSource = toupper(*pSource);
  79.             if (strstr(manifest, keywords)) Found_Manifest_With_Keywords = true;
  80.             return TRUE;
  81.         }
  82.     }
  83.     return FALSE;
  84. }
  85. BOOL CALLBACK EnumNamesFunc_Manifest(HMODULE hModule, LPCTSTR lpType, LPTSTR lpName,
  86.     LONG extra_parameter)
  87. {
  88.     return EnumResourceLanguagesW(hModule, lpType, lpName,
  89.         (ENUMRESLANGPROC)EnumLangsFunc_Manifest, extra_parameter);
  90. }
  91. BOOL CALLBACK EnumTypesFunc_Manifest(HMODULE hModule, LPTSTR lpType, LONG extra_parameter)
  92. {
  93.     if (IS_INTRESOURCE(lpType) && lpType == RT_MANIFEST) {
  94.         return EnumResourceNames(hModule, lpType, (ENUMRESNAMEPROC)EnumNamesFunc_Manifest, 0);
  95.     }
  96.     return TRUE;
  97. }
  98. int FileFilter(LPCWSTR pFileName) {
  99.     if (PathFileExistsW(pFileName)) {
  100.         LPCWSTR pExt = PathFindExtensionW(pFileName);
  101.         if (StrCmpIW(pExt, L".DLL") ||
  102.             StrCmpIW(pExt, L".EXE")) return 0;
  103.         return -1;
  104.     }
  105.     return -2;
  106. }

  107. BOOL FindResourceManifest(LPCWSTR pFileName, LPCWSTR keywords2) {
  108.     HANDLE g_hFile;
  109.     HMODULE hModule;
  110.     BOOL Result = FALSE;
  111.     if (FileFilter(pFileName)) return FALSE;
  112.     hModule = LoadLibraryExW(pFileName, nullptr, LOAD_LIBRARY_AS_DATAFILE);
  113.     if (!hModule) return FALSE;
  114.     __try {
  115.         size_t size = 0;
  116.         wcsrtombs_s(&size, keywords, &keywords2, MaxSizeOfKeywords, nullptr);
  117.         Found_Manifest_With_Keywords = false;
  118.         EnumResourceTypesW(hModule, (ENUMRESTYPEPROC)EnumTypesFunc_Manifest, 0);
  119.         if (Found_Manifest_With_Keywords) {
  120.             WCHAR filename_manifest[size_filename];
  121.             GetTempPathW(size_filename, filename_manifest);
  122.             GetTempFileNameW(filename_manifest, L"man", 0, filename_manifest);
  123.             PathCchRenameExtension(filename_manifest, size_filename, L"txt");
  124.             g_hFile = CreateFileW(filename_manifest,
  125.                 GENERIC_WRITE, 0, (LPSECURITY_ATTRIBUTES)NULL,
  126.                 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
  127.             if (g_hFile == INVALID_HANDLE_VALUE) __leave;
  128.             __try {
  129.                 LPCSTR seperator = "\r\n================= Manifest ====================\r\n";
  130.                 char Title[size_filename];
  131.                 size_t size;
  132.                 ZeroMemory(Title, size_filename);
  133.                 wcstombs_s(&size, Title, pFileName, size_filename);
  134.                 WriteFile(g_hFile, Title, (DWORD)size, &cbWritten, NULL);
  135.                 WriteFile(g_hFile, seperator, (DWORD)strlen(seperator), &cbWritten, NULL);
  136.                 WriteFile(g_hFile, lpLockManifest, SizeOfManifest, &cbWritten, NULL);
  137.             }
  138.             __finally {
  139.                 CloseHandle(g_hFile);
  140.                 ShellExecuteW(NULL, L"Open", filename_manifest, NULL, NULL, SW_NORMAL);
  141.             }
  142.             Result = TRUE;
  143.         }
  144.     }
  145.     __finally {
  146.         FreeLibrary(hModule);
  147.         return Result;
  148.     }
  149. }

  150. BOOL CALLBACK EnumLangsFunc(HMODULE hModule, LPCTSTR lpType, LPCTSTR lpName, WORD wLang,
  151.     LONG extra_parameter)
  152. {
  153.     HRSRC hResInfo;

  154.     hResInfo = FindResourceEx(hModule, lpType, lpName, wLang);
  155.     if (!hResInfo) {
  156.         MessageBox(0, L"hResInfo", NULL, 0);
  157.         return FALSE;
  158.     }
  159.     const wchar_t TypeFormat[] = L"%-30s";
  160.     if (!IS_INTRESOURCE(lpType))
  161.     {
  162.         wsprintfW(pBuf_Start, TypeFormat, lpType);
  163.     }
  164.     else {
  165.         wsprintfW(pBuf_Start, TypeFormat,
  166.             RT_Names[reinterpret_cast<USHORT>(lpType)]);
  167.     }
  168.     pBuf_Start += wcslen(pBuf_Start);

  169.     // const wchar_t NameFormat[] = L" %-30s ";
  170.     wchar_t Temp[111];
  171.     if (!IS_INTRESOURCE(lpName))
  172.     {
  173.         wsprintfW(pBuf_Start, L"(%-30s)", lpName);
  174.     }
  175.     else {
  176.         _itow_s(reinterpret_cast<USHORT>(lpName), Temp, 11);
  177.         wsprintfW(pBuf_Start, L" %-30s ", Temp);
  178.     }
  179.     pBuf_Start += wcslen(pBuf_Start);
  180.     wchar_t LocaleName[300];
  181.     LCIDToLocaleName(wLang, LocaleName, 300, 0);
  182.     wsprintfW(pBuf_Start, L"  %s(%X)     %p    %X\r\n",
  183.         LocaleName, (LCID)wLang, (void*)hResInfo, SizeofResource(hModule, hResInfo));
  184.     pBuf_Start += wcslen(pBuf_Start);
  185.     if (!IS_INTRESOURCE(lpType)) {
  186.         if (!wcscmp(lpType, L"PNG") && hResInfo) {
  187.             HGLOBAL hGlobal = LoadResource(hModule, hResInfo);
  188.             if (hGlobal) {
  189.                 MyPng_Image[CountOf_PngImage].lpvoid_PNG = LockResource(hGlobal);
  190.                 MyPng_Image[CountOf_PngImage].SizeOfPngResource = SizeofResource(hModule, hResInfo);
  191.                 CountOf_PngImage += 1;
  192.             }
  193.         }
  194.     }
  195.     return TRUE;
  196. }
  197. BOOL CALLBACK EnumNamesFunc(HMODULE hModule, LPCTSTR lpType, LPTSTR lpName,
  198.     LONG extra_parameter)
  199. {
  200.     return EnumResourceLanguages(hModule, lpType, lpName, (ENUMRESLANGPROC)EnumLangsFunc, 0);
  201. }
  202. BOOL CALLBACK EnumTypesFunc(HMODULE hModule, LPTSTR lpType, LONG extra_parameter)
  203. {
  204.     *pBuf_Start++ = L'\r';
  205.     *pBuf_Start++ = L'\n';
  206.     return EnumResourceNames(hModule, lpType, (ENUMRESNAMEPROC)EnumNamesFunc, 0);
  207. }

  208. BOOL MyEnumResource(LPCWSTR pFileName) {
  209.     HMODULE hModule;
  210.     BOOL Result = FALSE;
  211.     if (FileFilter(pFileName)) return FALSE;
  212.     hModule = LoadLibraryExW(pFileName, nullptr, LOAD_LIBRARY_AS_DATAFILE);
  213.     if (!hModule) return FALSE;
  214.     __try {
  215.         CountOf_PngImage = 0;
  216.         pBuf_Start = BufferForEnumRes;
  217.         wsprintfW(pBuf_Start,
  218.             L"%s\r\n=============== Enumerate resource ================\r\n"
  219.             L"           Tyep                Name                             "
  220.             L"LCID           Resource ptr        size",
  221.             pFileName);
  222.         pBuf_Start += wcslen(pBuf_Start);

  223.         if (!EnumResourceTypes(hModule, (ENUMRESTYPEPROC)EnumTypesFunc, 0)) {
  224.             __leave;
  225.         }

  226.         WCHAR Filename_resinfo[size_filename];
  227.         GetTempPathW(size_filename, Filename_resinfo);
  228.         GetTempFileNameW(Filename_resinfo, L"Res", 0, Filename_resinfo);
  229.         PathCchRenameExtension(Filename_resinfo, size_filename, L"txt");
  230.         HANDLE g_hFile;
  231.         g_hFile = CreateFileW(Filename_resinfo,
  232.             GENERIC_WRITE, 0,                     // share mode
  233.             (LPSECURITY_ATTRIBUTES)NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
  234.             (HANDLE)NULL);                       // no template
  235.         if (g_hFile == INVALID_HANDLE_VALUE)__leave;
  236.         __try {
  237.             WriteFile(g_hFile, BOM_UNICODE, (DWORD)sizeof(BOM_UNICODE), &cbWritten, nullptr);
  238.             WriteFile(g_hFile, BufferForEnumRes,
  239.                 DWORD(sizeof(BufferForEnumRes[0]) * (pBuf_Start - BufferForEnumRes)), &cbWritten, NULL);
  240.         }
  241.         __finally {
  242.             CloseHandle(g_hFile);
  243.             ShellExecuteW(nullptr, L"Open", Filename_resinfo, nullptr, nullptr, SW_NORMAL);
  244.             Result = TRUE;
  245.         }
  246.         if (CountOf_PngImage) {
  247.             for (int i = 0; i < CountOf_PngImage; i++) {
  248.                 WCHAR filename_png[size_filename];
  249.                 GetTempPathW(300, filename_png);
  250.                 GetTempFileNameW(filename_png, L"png", 0, filename_png);
  251.                 PathCchRenameExtension(filename_png, size_filename, L"png");
  252.                 HANDLE g_hFile;
  253.                 g_hFile = CreateFileW(filename_png, GENERIC_WRITE, 0,
  254.                     (LPSECURITY_ATTRIBUTES)NULL, CREATE_ALWAYS,
  255.                     FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);  // no template
  256.                 if (g_hFile == INVALID_HANDLE_VALUE) __leave;
  257.                 WriteFile(g_hFile, MyPng_Image[i].lpvoid_PNG,
  258.                     MyPng_Image[i].SizeOfPngResource, &cbWritten, NULL);
  259.                 CloseHandle(g_hFile);
  260.                 ShellExecute(NULL, L"Edit", filename_png, NULL, NULL, SW_NORMAL);
  261.             }
  262.         }
  263.     }
  264.     __finally {
  265.         FreeLibrary(hModule);
  266.     }
  267.     return Result;
  268. }

  269. extern HMODULE hModule_DLL;
  270. const CHAR Hi[] = "Hi, I am Mr. Chen.";


  271. INT_PTR CALLBACK About1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  272. {
  273.     UNREFERENCED_PARAMETER(lParam);
  274.     switch (message)
  275.     {
  276.     case WM_INITDIALOG:
  277.         return (INT_PTR)TRUE;

  278.     case WM_PAINT:
  279.     {
  280.         HDC hdc;
  281.         PAINTSTRUCT ps;
  282.         HANDLE hImage_Bitmap;
  283.         BITMAP bmp{};
  284.         RECT client_rect{};
  285.         hdc = BeginPaint(hDlg, &ps);
  286.         HDC hDC_memory;
  287.         hDC_memory = CreateCompatibleDC(hdc);
  288.         GetClientRect(hDlg, &client_rect);
  289.         hImage_Bitmap = LoadBitmapW(hModule_DLL, MAKEINTRESOURCE(IDB_BITMAP1));
  290.         if (hImage_Bitmap) {
  291.             SelectObject(hDC_memory, hImage_Bitmap);
  292.             GetObjectW(hImage_Bitmap, sizeof(bmp), &bmp);
  293.         }
  294.         RECT IDOK_Rect;
  295.         GetClientRect(GetDlgItem(hDlg, IDOK), &IDOK_Rect);
  296.         if (hFont)DeleteObject(hFont);
  297.         hFont = CreateFontW(IDOK_Rect.bottom, IDOK_Rect.right / 6, 0, 0,
  298.             FW_NORMAL, 0, 0, 0, CHINESEBIG5_CHARSET, OUT_RASTER_PRECIS,
  299.             CLEARTYPE_QUALITY, DEFAULT_QUALITY, FF_ROMAN | VARIABLE_PITCH, L"Dubai");
  300.         if (hFont) SelectObject(hdc, hFont);
  301.         SetTextColor(hdc, RGB(234, 5, 6));
  302.         POINT points[2];
  303.         points[0] = { 0,0 };
  304.         MapWindowPoints(GetDlgItem(hDlg, IDOK), hDlg, points, 1);
  305.         TextOutA(hdc, points[0].x + IDOK_Rect.right, points[0].y, Hi, strlen(Hi));
  306.         StretchBlt(hdc, 0, 0, client_rect.right, points[0].y,
  307.             hDC_memory, 0, 0, bmp.bmWidth, bmp.bmHeight,
  308.             SRCCOPY);
  309.         DeleteDC(hDC_memory);
  310.         EndPaint(hDlg, &ps);
  311.         break;
  312.     }
  313.     case WM_COMMAND:
  314.         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  315.         {
  316.             EndDialog(hDlg, LOWORD(wParam));
  317.             return (INT_PTR)TRUE;
  318.         }
  319.         break;
  320.     }
  321.     return (INT_PTR)FALSE;
  322. }
  323. void MyDialog(HWND hWnd) {
  324.     MessageBeep(0);
  325.     DPI_AWARENESS_CONTEXT hDPI =
  326.         SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
  327.     DialogBoxW(hModule_DLL, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, About1);
  328.     SetThreadDpiAwarenessContext(hDPI);
  329. }





#pragma once

#include "resource.h"
#include "shlwapi.h"
#include "strsafe.h"
#include "shellapi.h"
#include "My_Cpp_Resource.h"


void MainWin_WM_PAINT(HWND, HDC);
void DoubleClick(HWND);








  1. #include "MyBlog_Created_2024_11_17.h"
  2. void Test_SetDIbits(HDC, HBITMAP);
  3. void Store_BmpImage_To_File(BITMAPINFO* bmif, LPCWSTR pfilename);
  4. extern HINSTANCE hInst;
  5. HDC hDC_memo;
  6. BITMAP bmp;
  7. WCHAR Char_Buffer1[500] = L"Hi, I am Mr. Chen.";
  8. INT32 CX_Screen, CY_Screen;
  9. UINT32 Dpi;
  10. HBITMAP hImage_Bitmap[4];
  11. RECT client_rect;
  12. unsigned int loop2 = 0;
  13. COLORREF rgb[4] = { RGB(234,5,3),RGB(3,234,5),RGB(34,23,123),RGB(111,111,111) };
  14. void debug(LPCSTR str) {
  15.     MessageBeep(MB_ICONERROR);
  16.     MessageBoxA(NULL, str, "MyDebug", 0);
  17. }
  18. void DoubleClick(HWND hWnd) {
  19.     if (++loop2 >= 4)loop2 = 0;
  20.     GetObjectW(hImage_Bitmap[loop2], sizeof(bmp), &bmp);
  21.     SelectObject(hDC_memo, hImage_Bitmap[loop2]);
  22.     InvalidateRect(hWnd, NULL, FALSE);
  23. }

  24. void MainWin_WM_PAINT(HWND hWnd, HDC hdc) {
  25.     static boolean  FirstTime = true;
  26.     static HFONT hFont;
  27.     GetClientRect(hWnd, &client_rect);

  28.     if (FirstTime) {
  29.         FirstTime = false;
  30.         //Dpi = GetSystemDpiForProcess((HANDLE)NULL);
  31.         // CX_Screen = GetSystemMetricsForDpi(SM_CXSCREEN, Dpi);
  32.         // CY_Screen = GetSystemMetricsForDpi(SM_CYSCREEN, Dpi);
  33.         hImage_Bitmap[3] = LoadBitmapW(hInst, MAKEINTRESOURCE(IDB_BITMAP3));
  34.         hImage_Bitmap[2] = LoadBitmapW(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
  35.         hImage_Bitmap[1] = LoadBitmapW(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
  36.         hImage_Bitmap[0] = LoadBitmapW(hInst, MAKEINTRESOURCE(IDB_BITMAP4));
  37.         Test_SetDIbits(hdc, hImage_Bitmap[3]);

  38.         hDC_memo = CreateCompatibleDC(hdc);
  39.         SetStretchBltMode(hDC_memo, HALFTONE);
  40.         for (int i = 0; i < 4; i++) {
  41.             GetObjectW(hImage_Bitmap[i], sizeof(bmp), &bmp);
  42.             SelectObject(hDC_memo, hImage_Bitmap[i]);
  43.             if (!StretchBlt(hdc, 0, 0, client_rect.right, client_rect.bottom,
  44.                 hDC_memo, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY)) debug("StretchBlt");
  45.             Sleep(300);
  46.         }
  47.     }
  48.     SetStretchBltMode(hdc, HALFTONE);
  49.     if (!StretchBlt(hdc, 0, 0, client_rect.right, client_rect.bottom,
  50.         hDC_memo, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY)) debug("StretchBlt");

  51.     if (hFont)DeleteObject(hFont);
  52.     hFont = CreateFontW(client_rect.bottom / 20, client_rect.right / 70, 0, 0,
  53.         500, 0, 0, 0, CHINESEBIG5_CHARSET, OUT_RASTER_PRECIS, CLEARTYPE_QUALITY,
  54.         0, FF_ROMAN | VARIABLE_PITCH, L"Dubai");
  55.     if (hFont) SelectObject(hdc, hFont);
  56.     SetTextColor(hdc, rgb[loop2]);
  57.     DrawTextW(hdc, Char_Buffer1, (int)wcslen(Char_Buffer1), &client_rect, 0);
  58. }
  59. void Test_SetDIbits(HDC hdc, HBITMAP hBitmap_memo) {
  60.     HDC hDC_memo;
  61.     hDC_memo = CreateCompatibleDC(hdc);
  62.     int saveDC = SaveDC(hDC_memo);
  63.     HGLOBAL hDIB = GlobalAlloc(GHND, 50 << 20);
  64.     if (hDIB) {
  65.         int nline; BITMAP bmp;
  66.         GetObjectW(hBitmap_memo, sizeof(bmp), &bmp);
  67.         SelectObject(hDC_memo, hBitmap_memo);
  68.         SetTextColor(hDC_memo, RGB(234, 56, 67));
  69.         SetBkColor(hDC_memo, RGB(23, 156, 167));
  70.         TextOutA(hDC_memo, bmp.bmWidth - 200, bmp.bmHeight - 30,
  71.             "Hello world", 11);
  72.         UINT usage_rgb = DIB_RGB_COLORS;
  73.         UINT usage_pal = DIB_PAL_COLORS;
  74.         UINT Usage = usage_rgb;

  75.         BITMAPINFO* bmif = (BITMAPINFO*)GlobalLock(hDIB);
  76.         bmif->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  77.         nline = GetDIBits(hDC_memo, hBitmap_memo, 0, bmp.bmHeight,
  78.             nullptr, bmif, Usage);
  79.         if (!nline) debug("GetDIBits error 1");
  80.         nline = GetDIBits(hDC_memo, hBitmap_memo, 0, bmp.bmHeight,
  81.             bmif->bmiColors, bmif, Usage);
  82.         Store_BmpImage_To_File(bmif, L"MyDIBImage.bmp");

  83.         if (!nline)
  84.             wsprintf(Char_Buffer1,
  85.                 L" Width=%i (Height=%i nline=%i) (%i,%i) size=%iMB (%i %i) (%i %i)",
  86.                 bmif->bmiHeader.biWidth,
  87.                 bmif->bmiHeader.biHeight, nline,
  88.                 bmif->bmiHeader.biCompression, BI_BITFIELDS,
  89.                 (bmif->bmiHeader.biSizeImage >> 20),
  90.                 bmif->bmiHeader.biXPelsPerMeter, bmif->bmiHeader.biYPelsPerMeter,
  91.                 bmif->bmiHeader.biClrUsed, bmif->bmiHeader.biClrImportant
  92.             );
  93.         RECT r2{ client_rect.right / 4 ,  client_rect.bottom / 4,
  94.                   client_rect.right / 2,    client_rect.bottom / 2 };
  95.         Rectangle(hDC_memo, r2.left, r2.top, r2.right, r2.bottom);
  96.         DrawTextW(hDC_memo, L"ABCDEFG", 7, &r2, DT_CENTER);
  97.         r2.top = r2.bottom - 30;
  98.         DrawTextW(hDC_memo, L"1234567", 7, &r2, DT_RIGHT);
  99.         if (!SetDIBits(hDC_memo, hBitmap_memo, 0, nline,
  100.             bmif->bmiColors, bmif, Usage)) debug("SetDIBits");
  101.         if (GlobalUnlock(hDIB))debug("GlobalUnlock");
  102.         GlobalFree(hDIB);
  103.     }
  104.     if (!RestoreDC(hDC_memo, -1)) debug("RestoreDC error");
  105.     DeleteObject(hDC_memo);
  106. }

  107. void Store_BmpImage_To_File(BITMAPINFO* bmif, LPCWSTR pfilename) {
  108.     BITMAPFILEHEADER Bitmap_File_Header;
  109.     Bitmap_File_Header.bfType = 0x4d42;
  110.     Bitmap_File_Header.bfOffBits = sizeof(BITMAPINFO) + sizeof(BITMAPFILEHEADER);
  111.     Bitmap_File_Header.bfSize = Bitmap_File_Header.bfOffBits + bmif->bmiHeader.biSizeImage;
  112.     WCHAR Filename_bmp[MAX_PATH];
  113.     GetTempPathW(MAX_PATH, Filename_bmp);
  114.     PathCombineW(Filename_bmp, Filename_bmp, pfilename);
  115.     HANDLE g_hFile;
  116.     g_hFile = CreateFileW(Filename_bmp,
  117.         GENERIC_WRITE, 0,                     // share mode
  118.         (LPSECURITY_ATTRIBUTES)NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
  119.         (HANDLE)NULL);
  120.     if (g_hFile == INVALID_HANDLE_VALUE)return;
  121.     __try {
  122.         DWORD cbWritten;
  123.         WriteFile(g_hFile, &Bitmap_File_Header, sizeof(BITMAPFILEHEADER)
  124.             , &cbWritten, NULL);
  125.         WriteFile(g_hFile, bmif, sizeof(BITMAPINFOHEADER)
  126.             , &cbWritten, NULL);
  127.         WriteFile(g_hFile, bmif->bmiColors, bmif->bmiHeader.biSizeImage + (4 << 10)
  128.             , &cbWritten, NULL);
  129.     }
  130.     __finally {
  131.         CloseHandle(g_hFile);
  132.         ShellExecuteW(nullptr, L"Open", Filename_bmp, nullptr, nullptr, SW_NORMAL);
  133.     }
  134. }



  1. // MyBlog_Created_2024_11_17.cpp : 定義應用程式的進入點。
  2. //

  3. #include "framework.h"
  4. #include "MyBlog_Created_2024_11_17.h"

  5. #define MAX_LOADSTRING 100

  6. // 全域變數:
  7. HINSTANCE hInst;                                // 目前執行個體
  8. WCHAR szTitle[MAX_LOADSTRING];                  // 標題列文字
  9. WCHAR szWindowClass[MAX_LOADSTRING];            // 主視窗類別名稱

  10. // 這個程式碼模組所包含之函式的向前宣告:
  11. ATOM                MyRegisterClass(HINSTANCE hInstance);
  12. BOOL                InitInstance(HINSTANCE, int);
  13. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  14. INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

  15. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  16.     _In_opt_ HINSTANCE hPrevInstance,
  17.     _In_ LPWSTR    lpCmdLine,
  18.     _In_ int       nCmdShow)
  19. {
  20.     UNREFERENCED_PARAMETER(hPrevInstance);
  21.     UNREFERENCED_PARAMETER(lpCmdLine);

  22.     // TODO: 在此放置程式碼。

  23.     // 將全域字串初始化
  24.     LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  25.     LoadStringW(hInstance, IDC_MYBLOGCREATED20241117, szWindowClass, MAX_LOADSTRING);
  26.     MyRegisterClass(hInstance);

  27.     // 執行應用程式初始化:
  28.     if (!InitInstance(hInstance, nCmdShow))
  29.     {
  30.         return FALSE;
  31.     }

  32.     HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MYBLOGCREATED20241117));

  33.     MSG msg;

  34.     // 主訊息迴圈:
  35.     while (GetMessage(&msg, nullptr, 0, 0))
  36.     {
  37.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  38.         {
  39.             TranslateMessage(&msg);
  40.             DispatchMessage(&msg);
  41.         }
  42.     }

  43.     return (int)msg.wParam;
  44. }



  45. //
  46. //  函式: MyRegisterClass()
  47. //
  48. //  用途: 註冊視窗類別。
  49. //
  50. ATOM MyRegisterClass(HINSTANCE hInstance)
  51. {
  52.     WNDCLASSEXW wcex;

  53.     wcex.cbSize = sizeof(WNDCLASSEX);

  54.     wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  55.     wcex.lpfnWndProc = WndProc;
  56.     wcex.cbClsExtra = 0;
  57.     wcex.cbWndExtra = 0;
  58.     wcex.hInstance = hInstance;
  59.     wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYBLOGCREATED20241117));
  60.     wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  61.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  62.     wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_MYBLOGCREATED20241117);
  63.     wcex.lpszClassName = szWindowClass;
  64.     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

  65.     return RegisterClassExW(&wcex);
  66. }

  67. //
  68. //   函式: InitInstance(HINSTANCE, int)
  69. //
  70. //   用途: 儲存執行個體控制代碼並且建立主視窗
  71. //
  72. //   註解:
  73. //
  74. //        在這個函式中,我們將執行個體控制代碼儲存在全域變數中,
  75. //        並建立及顯示主程式視窗。
  76. //
  77. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  78. {
  79.     hInst = hInstance; // 將執行個體控制代碼儲存在全域變數中

  80.     HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  81.         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

  82.     if (!hWnd)
  83.     {
  84.         return FALSE;
  85.     }

  86.     ShowWindow(hWnd, nCmdShow);
  87.     UpdateWindow(hWnd);

  88.     return TRUE;
  89. }

  90. //
  91. //  函式: WndProc(HWND, UINT, WPARAM, LPARAM)
  92. //
  93. //  用途: 處理主視窗的訊息。
  94. //
  95. //  WM_COMMAND  - 處理應用程式功能表
  96. //  WM_PAINT    - 繪製主視窗
  97. //  WM_DESTROY  - 張貼結束訊息然後傳回
  98. //
  99. //
  100. const wchar_t Dll_NAME1[] = L"C:\\Program Files\\IIS Express\\nativrd2.dll";
  101. const wchar_t Dll_NAME2[] = L"C:\\Program Files (x86)\\IIS Express\\asp.dll";
  102. const wchar_t Notepad[] = L"C:\\Windows\\system32\\notepad.exe";
  103. WCHAR Main_ModuleFileName[MAX_PATH];
  104. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  105. {
  106.     switch (message)
  107.     {
  108.     case WM_CREATE:
  109.         GetModuleFileNameW(NULL, Main_ModuleFileName, MAX_PATH);
  110.         break;
  111.     case WM_RBUTTONDBLCLK:
  112.         MyDialog(hWnd);
  113.         break;
  114.     case WM_LBUTTONDBLCLK:
  115.         DoubleClick(hWnd);
  116.         break;
  117.     case WM_COMMAND:
  118.     {
  119.         int wmId = LOWORD(wParam);
  120.         // 剖析功能表選取項目:
  121.         switch (wmId)
  122.         {
  123.         case IDM_FindResourceManifest:
  124.             FindResourceManifest(Notepad, L"</Assembly>");
  125.             FindResourceManifest(Dll_NAME1, L"</Assembly>");
  126.             FindResourceManifest(Dll_NAME2, L"</Assembly>");
  127.             FindResourceManifest(Main_ModuleFileName, L"</Assembly>");
  128.             break;

  129.         case IDM_EnumResource:
  130.             MyEnumResource(Notepad);
  131.             MyEnumResource(Dll_NAME1);
  132.             MyEnumResource(Dll_NAME2);
  133.             MyEnumResource(Main_ModuleFileName);
  134.             break;
  135.         case IDM_ABOUT:
  136.             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  137.             break;
  138.         case IDM_EXIT:
  139.             DestroyWindow(hWnd);
  140.             break;
  141.         default:
  142.             return DefWindowProc(hWnd, message, wParam, lParam);
  143.         }
  144.     }
  145.     break;
  146.     case WM_PAINT:
  147.     {
  148.         PAINTSTRUCT ps;
  149.         HDC hdc = BeginPaint(hWnd, &ps);
  150.         // TODO: 在此新增任何使用 hdc 的繪圖程式碼...
  151.         MainWin_WM_PAINT(hWnd, hdc);
  152.         EndPaint(hWnd, &ps);
  153.     }
  154.     break;
  155.     case WM_DESTROY:
  156.         PostQuitMessage(0);
  157.         break;
  158.     default:
  159.         return DefWindowProc(hWnd, message, wParam, lParam);
  160.     }
  161.     return 0;
  162. }

  163. // [關於] 方塊的訊息處理常式。
  164. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  165. {
  166.     UNREFERENCED_PARAMETER(lParam);
  167.     switch (message)
  168.     {
  169.     case WM_INITDIALOG:
  170.         return (INT_PTR)TRUE;

  171.     case WM_COMMAND:
  172.         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  173.         {
  174.             EndDialog(hDlg, LOWORD(wParam));
  175.             return (INT_PTR)TRUE;
  176.         }
  177.         break;
  178.     }
  179.     return (INT_PTR)FALSE;
  180. }








Reference:Using Resources

留言

這個網誌中的熱門文章

Marshalling

Calling a C# WPF library from C++

Marshalling II