2016-07-30 14 views
1

Ich benutze Visual Studio im Moment. Ich brauche eine Win32-Anwendung zu bauen und benötigen eine Prozedur aus einer C-Funktion zu nennen, aber ich bin immer ein Build-Fehler bekommen:Aufruf von MASM32-Prozedur von .c

Fehler 3 Fehler LNK1120: 1 nicht aufgelöste externe

ich alles auf eine einfache reduziert Hauptfunktion und einfache .ASM-Datei mit einer Prozedur und ich bekomme immer noch den gleichen Build (oder Link) Fehler. Ich bin ratlos.

Beide verwenden die cdecl-Konvention.

Der MASM32 Code (in seiner eigenen .asm-Datei):

.MODEL FLAT, C 
.DATA    

.CODE  

PUBLIC memory_address 

memory_address PROC 

    mov eax, DWORD PTR [esp] 

    ret 

memory_address ENDP 

END 

Es versammelt in Ordnung. Die .c-Datei:

#include <stdlib.h> 
#include <malloc.h> 
#include <stdio.h> 

extern int memory_address(int* ptr); 

void main() 
{ 
    int *ptr = (int*)malloc(sizeof(int)); 

    memory_address(ptr); 

    while (1) {} 

    return; 
} 

Keine Ahnung, warum das passiert. Ich benutze MASM gerne für 64-Bit-Anwendungen für ungefähr ein Jahr oder so ohne Probleme. Aber ich muss eine 32-Bit-Anwendung machen, ich habe kein Glück, den MASM32 proc memory_address() aufzurufen.

Ich beeile mich hinzuzufügen Ich weiß, wie dies in NASM für 32-Bit-Anwendungen zu tun, und ich weiß, wie es für 64-Bit-Anwendungen mit MASM zu tun. Dies ist streng genommen ein MASM32-Problem. Irgendwelche Vorschläge wären großartig - aber nur für MASM32. Vielen Dank.

+0

Ich weiß, dass Sie die Antworten für MASM32 wollen, aber wie haben Sie tun dies in NASM? Könntest du das auch zeigen? Bearbeiten Sie einfach Ihre Frage, um den NASM-Code anzuzeigen, der funktioniert hat. –

+2

Versuchen Sie, dem Namen des masm-Verfahrens einen führenden Unterstrich hinzuzufügen? – anatolyg

+1

Erwähnt es auch den Namen, den es zu finden versucht, direkt vor dem Fehler, den du zitiert hast? – anatolyg

Antwort

1

Sie können Ihr ASM-Modul als DLL erstellen.

Sein einfaches STDCALL für all dies zu verwenden, so statt:

.MODEL FLAT, C 

können Sie:

.model flat, stdcall 

einfach erstellen zusätzlich zu Ihrem yourmodule.asm ein yourmodule.def Datei. Innerhalb dieser Stelle diese Zeilen:

LIBRARY "yourmodule.dll" 
EXPORTS memory_address 

dann verwenden: ml.exe/c/Kaff yourmodule.asm Link.exe/SUBSYSTEM: CONSOLE/DLL /DEF:yourmodule.def yourmodule.obj

In Ihrem C++ Anwendung dann entfernen:

extern int memory_address(int* ptr); 

und hinzufügen:

typedef void*(__stdcall *PTRmemory_address)(int*); 
extern PTRmemory_address memory_address = NULL; // init as "NOT PRESENT" 

HMODULE yourmoduleHMODULE; 
yourmoduleHMODULE = GetModuleHandleA("yourmodule.dll"); // ensure valid file path! 
if (!yourmoduleHMODULE) 
    yourmoduleHMODULE = LoadLibraryA("yourmodule.dll"); // ensure valid file path! 

if (yourmoduleHMODULE) 
{ 
    memory_address = (PTRmemory_address)GetProcAddress(yourmoduleHMODULE, "memory_address"); 
    if (!memory_address) 
    { 
     printf("\n Cannot Find function memory_address in yourmodule.dll"); 
     exit(1); // exit application when function in DLL not found 
    } 
}  
else 
{ 
    printf("\n yourmodule.dll not found"); 
    exit(1); // exit application when DLL not found 
} 

Aufruf Ihrer Funktion:

int *ptr = (int*)malloc(sizeof(int)); 

if (memory_address) // ensure, that your function is present 
    memory_address(ptr); 
else 
    printf("\n error"); 

    // ....