我现在用的是视觉工作室。我需要构建一个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。谢谢。
发布于 2016-08-31 19:47:28
您可以将asm模块构建为DLL。
所有这些都很容易使用STDCALL,因此:
.MODEL FLAT, C您可以使用:
.model flat, stdcall只需在您的yourmodule.def文件之外创建一个yourmodule.asm文件。在该区域内有以下几条线:
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");
// ....https://stackoverflow.com/questions/38679118
复制相似问题