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.