I eventually found a form of manifest that works OK on a Win64 executable. The version below has conventional resources of an icon, menu and manifest file. I have added a couple of macros in the macros64.inc file and its starting to read like reasonable code. Note that the icon is a 3 resolution RGB/A version that is 15k in size. The executable is about 5k.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
OPTION DOTNAME
option casemap:none
include \masm64\include\temphls.inc
include \masm64\include\win64.inc
include \masm64\include\kernel32.inc
include \masm64\include\user32.inc
include \masm64\include\msvcrt.inc
includelib \masm64\lib\kernel32.lib
includelib \masm64\lib\user32.lib
includelib \masm64\lib\msvcrt.lib
OPTION PROLOGUE:rbpFramePrologue
OPTION EPILOGUE:rbpFrameEpilogue
include macros64.inc
WNDCLASSEX64 STRUCT QWORD
cbSize dd ?
style dd ?
lpfnWndProc dq ?
cbClsExtra dd ?
cbWndExtra dd ?
hInstance dq ?
hIcon dq ?
hCursor dq ?
hbrBackground dq ?
lpszMenuName dq ?
lpszClassName dq ?
hIconSm dq ?
WNDCLASSEX64 ENDS
.data
ClassName db "API Window Class",0
AppName db "ML64 Example Window",0
.data?
hInstance dq ?
hWnd dq ?
sWid dq ?
sHgt dq ?
lft dq ?
top dq ?
wid dq ?
hgt dq ?
hIcon dq ?
hMnu dq ?
.code
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
main proc
LOCAL wcex:WNDCLASSEX64
invoke GetModuleHandle,0
mov hInstance, rax
invoke LoadIcon,hInstance,10
mov hIcon, rax
mov wcex.cbSize, SIZEOF WNDCLASSEX64
mov wcex.style, 0
mrm wcex.lpfnWndProc, OFFSET WndProc
mov wcex.cbClsExtra, 0
mov wcex.cbWndExtra, 0
mrm wcex.hInstance, hInstance
mrm wcex.hIcon, hIcon
mov wcex.hCursor, 10003h
mov wcex.hbrBackground, COLOR_WINDOW
mrm wcex.lpszMenuName, 0
mrm wcex.lpszClassName, OFFSET ClassName
mrm wcex.hIconSm, hIcon
invoke RegisterClassEx, ADDR wcex
; ------------------------------------
; centred half height and width window
; ------------------------------------
invoke GetSystemMetrics,SM_CXSCREEN
mov r11, rax
shr rax, 2
mov lft, rax
mov rax, r11
shr rax, 1
mov wid, rax
invoke GetSystemMetrics,SM_CYSCREEN
mov r11, rax
shr rax, 2
mov top, rax
mov rax, r11
shr rax, 1
mov hgt, rax
invoke CreateWindowEx,0,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
lft,top,wid,hgt,0,0,hInstance,0
mov hWnd, rax
invoke LoadMenu,hInstance,100
invoke SetMenu,hWnd,rax
call msgloop
invoke ExitProcess, rax
retn
main endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
msgloop proc
LOCAL msg :MSG
mov r11, rdi ; preserve rdi
lea rdi, msg ; load structure address
jmp gmsg
@@:
fn64 TranslateMessage,rdi
fn64 DispatchMessage,rdi
gmsg:
fn64 GetMessage,rdi,0,0,0
test rax, rax
jnz @B
mov rdi, r11 ; restore rdi
retn
msgloop endp
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
WndProc proc
LOCAL64 hWin
LOCAL64 uMsg
LOCAL64 wParam
LOCAL64 lParam
mov hWin, rcx
mov uMsg, rdx
mov wParam, r8
mov lParam, r9
.if uMsg == WM_COMMAND
.if wParam == 1000
fn64 SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 10000
fn64 MessageBox,hWin,txt("Example with icon and menu."),txt("About ML64 Example"),0
.endif
.elseif uMsg == WM_CLOSE
fn64 MessageBox,0,txt("Seeya round like a Rubens."),txt("WM_CLOSE here"),0
fn64 SendMessage,hWin,WM_DESTROY,0,0
.elseif uMsg == WM_DESTROY
fn64 PostQuitMessage,NULL
.endif
fn64 DefWindowProc,hWin,uMsg,wParam,lParam
retn
WndProc endp
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end