2010-11-08 43 views
11

J'essaie de créer un programme helloworld en utilisant uniquement des bibliothèques masm et masm32. Voici l'extrait de code:error LNK2001: symbole externe non résolu _MessageBox

.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 

Je suis en mesure de monter cela en utilisant 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 

Cependant, je ne peux pas lier:

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 

J'inclus les libs lors de la liaison, alors je ne sais pas pourquoi il dit encore des symboles non résolus?

MISE À JOUR:

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 [email protected] 
demo.exe : fatal error LNK1120: 1 unresolved externals 

MISE À JOUR 2: Code de travail final!

.386 
.model flat, stdcall 
option casemap :none 

extrn [email protected] : PROC 
extrn [email protected] : PROC 

.data 
     HelloWorld db "Hello There!", 0 

.code 
start: 

     lea eax, HelloWorld 
     mov ebx, 0 
     push ebx 
     push eax 
     push eax 
     push ebx 
     call [email protected] 
     push ebx 
     call [email protected] 

end start 

Répondre

17

Les noms de fonction sont correctes [email protected] et [email protected].

Presque toutes les fonctions API Win32 sont stdcall, donc their names are decorated avec un signe @, suivi du nombre d'octets pris par leurs paramètres. En outre, lorsqu'une fonction Win32 prend une chaîne, il existe deux variantes: une qui prend une chaîne ANSI (nom se termine par A) et une qui prend une chaîne Unicode (le nom se termine par W). Vous fournissez une chaîne ANSI, vous voulez donc la version A. Lorsque vous ne programmez pas en assembleur, le compilateur s'occupe de ces points pour vous.

+0

Merci! Cela a résolu l'une des erreurs de lien, mais pas l'autre .. voir mise à jour – Jumbo

+0

Bon point, voir mon édition. –

+0

Génial! a parfaitement fonctionné maintenant. Je me sens comme un tel n00b - pouvez-vous suggérer des docs/livres où je peux choisir tous ces trucs? MSDN est trop difficile à explorer lorsque vous êtes novice. – Jumbo

5

Essayez d'ajouter ceci avant .data segment:

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