我现在正在使用 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。谢谢。
您可以将 asm 模块构建为 DLL。
使用 STDCALL 可以轻松实现这一切,
所以与其:
.MODEL FLAT, C
您可以使用:
.model flat, stdcall
只需在 yourmodule.asm 中创建额外的内容
A你的模块.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");
// ....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)