2016-07-30 60 views
1

我目前正在使用visual studio。我需要建立一个Win32应用程序,需要从C函数调用一个过程,但我总是得到一个编译错误:从.c调用MASM32程序

错误3错误LNK1120:1周无法解析的外部

我把一切都降低到一个简单的主函数和简单的.asm文件与一个过程,我仍然得到相同的构建(或更确切地说,链接)的错误。我很茫然。

两者都使用cdecl约定。

的MASM32代码(在它自己的.asm文件):

.MODEL FLAT, C 
.DATA    

.CODE  

PUBLIC memory_address 

memory_address PROC 

    mov eax, DWORD PTR [esp] 

    ret 

memory_address ENDP 

END 

它组装的罚款。 .c文件:

#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; 
} 

不知道为什么会发生这种情况。我一直在使用MASM高兴地为64位应用程序大约一年左右没有问题。但我必须做一个32位应用程序,我没有运气调用MASM32 proc memory_address()。

我急于添加我知道如何在NASM中为32位应用程序执行此操作,我知道如何为使用MASM的64位应用程序执行此操作。这完全是一个MASM32问题。任何建议都会很棒 - 但只适用于MASM32。谢谢。

+0

我知道你想为MASM32答案,但你是怎么在NASM做到这一点?你能证明吗?只需编辑你的问题,以显示工作的NASM代码。 –

+2

尝试添加一个前导下划线到masm过程的名称? – anatolyg

+1

另外,它是否提到它试图找到的名称,就在您引用错误之前? – anatolyg

回答

1

您可以将您的asm模块构建为DLL。

它易于使用STDCALL这一切, 这样反而:

.MODEL FLAT, C 

你可以使用:

.model flat, stdcall 

简单地创建附加到你的yourmodule.asm 一个yourmodule.def文件。 在那个地方这些行:

LIBRARY "yourmodule.dll" 
EXPORTS memory_address 

然后使用: ML.EXE/C/COFF yourmodule.asm LINK.EXE/SUBSYSTEM:CONSOLE/DLL /DEF:yourmodule.def yourmodule.obj

在你的C++应用程序,然后删除:

extern int memory_address(int* ptr); 

,并添加代替:

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 
} 

调用你的函数:

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

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

    // ....