首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MASM32调用.c过程

从MASM32调用.c过程
EN

Stack Overflow用户
提问于 2016-07-30 22:37:39
回答 1查看 1K关注 0票数 1

我现在用的是视觉工作室。我需要构建一个win32应用程序,并且需要从一个C函数调用一个过程,但是我总是得到一个构建错误:

错误3错误LNK1120: 1未解决的外部因素

我用一个过程将所有内容简化为一个简单的主函数和简单的.asm文件,我仍然得到相同的构建(或者链接)错误。我不知所措。

两人都在使用cdecl约定。

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

代码语言:javascript
复制
.MODEL FLAT, C
.DATA              

.CODE      

PUBLIC memory_address

memory_address PROC 

    mov eax, DWORD PTR [esp] 

    ret

memory_address ENDP

END

它装配得很好。.c文件:

代码语言:javascript
复制
#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。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-08-31 19:47:28

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

所有这些都很容易使用STDCALL,因此:

代码语言:javascript
复制
.MODEL FLAT, C

您可以使用:

代码语言:javascript
复制
.model flat, stdcall

只需在您的yourmodule.def文件之外创建一个yourmodule.asm文件。在该区域内有以下几条线:

代码语言:javascript
复制
LIBRARY "yourmodule.dll"
EXPORTS memory_address

然后使用: ml.exe /c /coff yourmodule.asm Link.exe /SUBSYSTEM:CONSOLE /DLL /DEF:yourmodule.def yourmodule.obj

然后在C++应用程序中删除:

代码语言:javascript
复制
extern int memory_address(int* ptr);

代之以:

代码语言:javascript
复制
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
}

调用您的功能:

代码语言:javascript
复制
int *ptr = (int*)malloc(sizeof(int));

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

    // ....
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38679118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档