错误LNK2001:未解析的外部符号_MessageBox

Jum*_*mbo 12 assembly winapi masm masm32

我正在尝试使用masm而不是masm32库来创建helloworld程序.这是代码片段:

.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
Run Code Online (Sandbox Code Playgroud)

我可以使用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
Run Code Online (Sandbox Code Playgroud)

但是,我无法链接它:

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
Run Code Online (Sandbox Code Playgroud)

我在链接期间包含了libs,所以不确定为什么它仍然说未解析的符号?

更新:

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
Run Code Online (Sandbox Code Playgroud)

更新2:最终工作代码!

.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
Run Code Online (Sandbox Code Playgroud)

Tim*_*son 17

正确的函数名称是MessageBoxA@16ExitProcess@4.

几乎所有Win32 API函数都是stdcall,因此它们的名称@符号装饰,后跟参数占用的字节数.

此外,当Win32函数采用字符串时,有两种变体:一种采用ANSI字符串(名称以字符结尾A),另一种采用Unicode字符串(名称以字符结尾W).您正在提供ANSI字符串,因此您需要该A版本.

如果您没有使用汇编编程,编译器会为您处理这些问题.


jyz*_*jyz 5

尝试在.data分段前添加此内容:

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
Run Code Online (Sandbox Code Playgroud)