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

12

我正在尝试使用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

我可以使用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

但是,我无法将它链接起来:

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

我在链接过程中包含了库文件,但不确定为什么它仍然显示未解析的符号?
更新:
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

更新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
2个回答

17
正确的函数名称是 MessageBoxA@16ExitProcess@4
几乎所有的 Win32 API 函数都是 stdcall 呼叫方式,因此 它们的名称装饰 有一个 @ 符号,后面跟着参数所占用的字节数。
此外,当 Win32 函数使用字符串时,有两种变体:一种接受 ANSI 字符串(名称以 A 结尾),另一种接受 Unicode 字符串(名称以 W 结尾)。您正在提供一个 ANSI 字符串,因此您需要使用 A 版本。
当您不使用汇编语言进行编程时,编译器会为您处理这些问题。

太棒了!现在完美运行。我感觉自己像个新手 - 你能推荐一些文档/书籍,让我可以从中学到所有这些东西吗?对于初学者来说,MSDN 太令人生畏了。 - Jumbo
您可能还想参考Iczelion的Win32 ASM教程:http://win32assembly.online.fr/ - swatkat
1
我喜欢Randall Hyde的东西: http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/Win32Asm/index.html。他使用HLA,它实际上是在原始MASM之上的一组宏,但原理是相同的。 - Tim Robinson
1
顺便说一句,这些不是新手问题:使用汇编语言时,你必须处理许多烦人的细节,而高级工具通常会处理这些细节。 - Tim Robinson
你可以使用 invoke 来避免 push。 - justyy
显示剩余3条评论

5

.data段之前添加以下内容:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接