J'ai ce programme C++, il compile correctement, mais à l'exécution j'ai une erreur, échec du chargement de l'icône.

Main.cpp
#define UNICODE
#define _UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shellapi.h>
#include <iostream>
#include <chrono>
#include <atomic>
#include <iomanip>
#include "resources.h"

#define WM_TRAYICON (WM_USER + 1)
#define IDI_TRAYICON 101
#define IDM_EXIT 102
#define IDI_MYICON 101

alignas(64) std::atomic<LONGLONG> g_lastLeftClickTime{0};
LARGE_INTEGER g_frequency;
LONGLONG g_thresholdTicks;
HHOOK g_hMouseHook = NULL;
HWND g_hWnd = NULL;
NOTIFYICONDATAW g_nid = {0};
std::atomic<bool> g_blockNextLButtonUp{false};  // Indicateur de blocage du prochain WM_LBUTTONUP


__forceinline bool shouldBlockLeftClick(LONGLONG currentCounter) noexcept {
    LONGLONG lastCounter = g_lastLeftClickTime.load(std::memory_order_relaxed);
    LONGLONG elapsedTicks = currentCounter - lastCounter;
    if (elapsedTicks < g_thresholdTicks) {
        g_lastLeftClickTime.store(currentCounter, std::memory_order_relaxed);
        return true;
    }
    g_lastLeftClickTime.store(currentCounter, std::memory_order_relaxed);
    return false;
}

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) noexcept {
    if (nCode >= 0) {
        LARGE_INTEGER currentCounter;
        QueryPerformanceCounter(&currentCounter);
        
        switch (wParam) {
            case WM_LBUTTONDOWN: {
                if (shouldBlockLeftClick(currentCounter.QuadPart)) {
                    g_blockNextLButtonUp.store(true, std::memory_order_relaxed);  // Indiquer de bloquer le prochain WM_LBUTTONUP
                    return 1; // Bloque l'événement
                }
                g_blockNextLButtonUp.store(false, std::memory_order_relaxed);  // Ne pas bloquer le prochain WM_LBUTTONUP
                break;
            }
            case WM_LBUTTONUP: {
                if (g_blockNextLButtonUp.load(std::memory_order_relaxed)) {
                    return 1; // Bloque l'événement
                }
                break;
            }
        }
    }
    
    return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_TRAYICON:
            if (lParam == WM_RBUTTONUP) {
                POINT pt;
                GetCursorPos(&pt);
                HMENU hMenu = CreatePopupMenu();
                AppendMenuW(hMenu, MF_STRING, IDM_EXIT, L"Quitter");
                SetForegroundWindow(hWnd);
                TrackPopupMenu(hMenu, TPM_RIGHTALIGN | TPM_BOTTOMALIGN, pt.x, pt.y, 0, hWnd, NULL);
                DestroyMenu(hMenu);
            }
            break;
        case WM_COMMAND:
            if (LOWORD(wParam) == IDM_EXIT) {
                DestroyWindow(hWnd);
            }
            break;
        case WM_DESTROY:
            Shell_NotifyIconW(NIM_DELETE, &g_nid);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProcW(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    QueryPerformanceFrequency(&g_frequency);
    g_thresholdTicks = (LONGLONG)(100.0 * g_frequency.QuadPart / 1000.0);

    WNDCLASSEXW wcex = {0};
    wcex.cbSize = sizeof(WNDCLASSEXW);
    wcex.lpfnWndProc = WindowProc;
    wcex.hInstance = hInstance;
    wcex.lpszClassName = L"MouseClickBlockerClass";
    RegisterClassExW(&wcex);

	g_hWnd = CreateWindowExW(0, L"MouseClickBlockerClass", L"Mouse Click Blocker",
	                        0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);

    // Initialisation de l'icône
    HICON hIcon = (HICON)LoadImage(hInstance, 
                                   MAKEINTRESOURCE(IDI_MYICON),
                                   IMAGE_ICON,
                                   GetSystemMetrics(SM_CXSMICON),
                                   GetSystemMetrics(SM_CYSMICON),
                                   LR_DEFAULTCOLOR);

    if (hIcon == NULL) {
        MessageBoxW(NULL, L"Échec du chargement de l'icône", L"Erreur", MB_ICONERROR);
        return 1;
    }

    g_nid.cbSize = sizeof(NOTIFYICONDATAW);
    g_nid.hWnd = g_hWnd;
    g_nid.uID = IDI_MYICON;
    g_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    g_nid.uCallbackMessage = WM_TRAYICON;
    g_nid.hIcon = hIcon;
    wcscpy_s(g_nid.szTip, L"Mouse Click Blocker");

    if (!Shell_NotifyIconW(NIM_ADD, &g_nid)) {
        MessageBoxW(NULL, L"Échec de l'ajout de l'icône dans le system tray", L"Erreur", MB_ICONERROR);
        return 1;
    }

    g_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0);
    if (g_hMouseHook == NULL) {
        MessageBoxW(NULL, L"Échec de l'installation du hook souris", L"Erreur", MB_ICONERROR);
        return 1;
    }

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(g_hMouseHook);
	DestroyIcon(g_nid.hIcon);
    return (int)msg.wParam;
}

ressource.h
/* THIS FILE WILL BE OVERWRITTEN BY DEV-C++ */
/* DO NOT EDIT ! */

#ifndef MOUSEHOOKTRAY_PRIVATE_H
#define MOUSEHOOKTRAY_PRIVATE_H

/* VERSION DEFINITIONS */
#define VER_STRING	"1.0.0.0"
#define VER_MAJOR	1
#define VER_MINOR	0
#define VER_RELEASE	0
#define VER_BUILD	0
#define COMPANY_NAME	""
#define FILE_VERSION	"1.0.0.0"
#define FILE_DESCRIPTION	"BAD MOUSE PUNISHER"
#define INTERNAL_NAME	""
#define LEGAL_COPYRIGHT	""
#define LEGAL_TRADEMARKS	""
#define ORIGINAL_FILENAME	""
#define PRODUCT_NAME	""
#define PRODUCT_VERSION	"1.0.0.0"
#define IDI_MYICON 101

#endif /*MOUSEHOOKTRAY_PRIVATE_H*/
resource.rc
/* THIS FILE WILL BE OVERWRITTEN BY DEV-C++ */
/* DO NOT EDIT! */

IDI_MYICON ICON "MouseHookTray.ico"

L'icone est bien présente dans le dossier, et est utilisé correctement pour le fichier exe, mais j'ai quand même une erreur me disant echec du chargement de l'icone lors de l'execution du fichier.