form error winapi assembly masm masm32

winapi - form - error LNK2001: símbolo externo sin resolver_MessageBox



error lnk2019 (2)

Intente agregar esto antes del segmento .data :

include /masm32/include/kernel32.inc include /masm32/include/user32.inc includelib /masm32/lib/kernel32.lib includelib /masm32/lib/user32.lib

Intento crear un programa helloworld usando solo masm y no masm32 libs. Aquí está el fragmento de código:

.386 .model flat, stdcall option casemap :none extrn MessageBox : PROC extrn ExitProcess : PROC .data HelloWorld db "Hello There!", 0 .code start: lea eax, HelloWorld mov ebx, 0 push ebx push eax push eax push ebx call MessageBox push ebx call ExitProcess end start

Puedo armar esto usando masm:

c:/masm32/code>ml /c /coff demo.asm Microsoft (R) Macro Assembler Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. Assembling: demo.asm

Sin embargo, no puedo vincularlo:

c:/masm32/code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user 32.lib demo.obj Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. demo.obj : error LNK2001: unresolved external symbol _MessageBox demo.obj : error LNK2001: unresolved external symbol _ExitProcess demo.exe : fatal error LNK1120: 2 unresolved externals

Estoy incluyendo las librerías durante el enlace, por lo que no estoy seguro de por qué todavía dice símbolos no resueltos.

ACTUALIZAR:

c:/masm32/code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user 32.lib demo.obj Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. demo.obj : error LNK2001: unresolved external symbol _MessageBox@16 demo.exe : fatal error LNK1120: 1 unresolved externals

ACTUALIZACIÓN 2: código de trabajo final!

.386 .model flat, stdcall option casemap :none extrn MessageBoxA@16 : PROC extrn ExitProcess@4 : PROC .data HelloWorld db "Hello There!", 0 .code start: lea eax, HelloWorld mov ebx, 0 push ebx push eax push eax push ebx call MessageBoxA@16 push ebx call ExitProcess@4 end start


Los nombres de función correctos son MessageBoxA@16 y ExitProcess@4 .

Casi todas las funciones de la API de Win32 son stdcall, por lo que sus nombres están decorados con un signo @ , seguido de la cantidad de bytes ocupados por sus parámetros.

Además, cuando una función Win32 toma una cadena, hay dos variantes: una que toma una cadena ANSI (el nombre termina en A ) y otra que toma una cadena Unicode (el nombre termina en W ). Está suministrando una cadena ANSI, por lo que desea la versión A

Cuando no está programando en ensamblador, el compilador se encarga de estos puntos por usted.