2016-07-30 4 views
1

Я использую визуальную студию на данный момент. Мне нужно создать приложение win32 и нужно вызвать процедуру из функции C, но я всегда получаю ошибку компиляции:Вызов процедуры MASM32 от .c

Ошибки LNK1120 3 ошибки: 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-битных приложений, и я знаю, как это сделать для 64-битных приложений с использованием MASM. Это проблема 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/с/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"); 

    // ....