Visual Studio中MASM32 Win32程序编译失败求助
MASM32在Visual Studio 2022中编译失败排查
问题概况
在Visual Studio 2022 Community中编译MASM32汇编文件时持续失败,程序在其他机器可正常运行,推测是依赖项或系统兼容问题,已尝试将项目移入MASM32目录,问题仍未解决。
构建输出
1>------ Build started: Project: Project1, Configuration: Debug|Win32 ------ 1> Assembling childWnd.asm... 1>C:\masm32\include\winextra.inc(9722): error A2026: constant expected 1>C:\masm32\include\winextra.inc(9723): error A2026: constant expected 1>C:\Project1\childWnd.asm(80): warning A6004: procedure argument or local not referenced : hPrevInst 1>C:\Project1\childWnd.asm(80): warning A6004: procedure argument or local not referenced : CmdLine 1>C:\Project1\childWnd.asm(80): warning A6004: procedure argument or local not referenced : CmdShow 1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\BuildCustomizations\masm.targets(70,5): error MSB3721: The command "ml.exe /c /nologo /Zi /Fo"Debug\childWnd.obj" /W3 /errorReport:prompt /TachildWnd.asm" exited with code 1. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
程序代码
.386 .model flat,stdcall option casemap:none WinMain proto :DWORD,:DWORD,:DWORD,:DWORD include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 MenuName db "FirstMenu",0 ButtonClassName db "button",0 ButtonText db "My First Button",0 EditClassName db "edit",0 TestString db "Wow! I'm in an edit box now",0 .data? hInstance HINSTANCE ? CommandLine LPSTR ? hwndButton HWND ? hwndEdit HWND ? buffer db 512 dup(?) ; buffer to store the text retrieved from the edit box .const ButtonID equ 1 ; The control ID of the button control EditID equ 2 ; The control ID of the edit control IDM_HELLO equ 1 IDM_CLEAR equ 2 IDM_GETTEXT equ 3 IDM_EXIT equ 4 .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,OFFSET MenuName mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName, \ ADDR AppName, WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT, CW_USEDEFAULT,\ 300,200,NULL,NULL, hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_CREATE invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\ WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\ ES_AUTOHSCROLL,\ 50,35,200,25,hWnd,8,hInstance,NULL mov hwndEdit,eax invoke SetFocus, hwndEdit invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\ 75,70,140,25,hWnd,ButtonID,hInstance,NULL mov hwndButton,eax .ELSEIF uMsg==WM_COMMAND mov eax,wParam .IF lParam==0 .IF ax==IDM_HELLO invoke SetWindowText,hwndEdit,ADDR TestString .ELSEIF ax==IDM_CLEAR invoke SetWindowText,hwndEdit,NULL .ELSEIF ax==IDM_GETTEXT invoke GetWindowText,hwndEdit,ADDR buffer,512 invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK .ELSE invoke DestroyWindow,hWnd .ENDIF .ELSE .IF ax==ButtonID shr eax,16 .IF ax==BN_CLICKED invoke SendMessage,hWnd,WM_COMMAND,IDM_GETTEXT,0 .ENDIF .ENDIF .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
排查方向
1. 修复winextra.inc常量错误
- 错误根源是MASM32头文件与Visual Studio自带的ML.exe版本不兼容:VS2022使用的新版ML.exe,语法检查更严格,而MASM32的
winextra.inc可能是针对旧版MASM编写的。 - 两种解决途径:
- 替换MASM32目录下的
winextra.inc为适配新版MASM的版本; - 配置项目使用MASM32自带的ML.exe:右键项目→属性→配置属性→MASM→常规,将
工具可执行文件路径改为C:\masm32\bin\ml.exe。
- 替换MASM32目录下的
2. 检查项目路径配置
- 即使项目在MASM32目录,仍需手动配置VS的包含与库路径:
- 右键项目→属性→VC++目录→包含目录,添加
C:\masm32\include; - 库目录添加
C:\masm32\lib。
- 右键项目→属性→VC++目录→包含目录,添加
3. 处理无关警告
A6004是未引用参数的警告,不影响编译,可通过以下方式消除:- 在项目MASM属性中降低警告等级;
- 在代码中给未使用的参数添加
UNUSED宏(如UNUSED hPrevInst)。
4. 适配Windows SDK版本
- 若VS安装的Windows SDK版本过高,可能与MASM32头文件冲突:
- 安装较低版本的Windows SDK(如Windows 10 SDK 19041);
- 右键项目→属性→配置属性→常规→Windows SDK版本,选择安装的旧版本。
内容的提问来源于stack exchange,提问作者Mohamed Tarek
相关产品推荐
相关产品推荐

