我目前正在使用visual studio。我需要构建一个win32应用程序,需要从C函数调用一个过程,但我总是遇到构建错误:
错误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 :(得分: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");
// ....