2016-07-30 15 views
1

私は現時点でVisual Studioを使用しています。私は、Win32アプリケーションを構築する必要があるとC関数からプロシージャを呼び出す必要があるが、私は常にビルドエラーを取得しています:.cからMASM32プロシージャを呼び出す

エラー3エラーLNK1120:1つの未解決の外部

私がダウンしてシンプルにすべてが減少していますメイン関数と単純な.asmファイルを1つのプロシージャと私はまだ同じビルド(またはむしろリンク)エラーを取得しています。私は迷っている。

どちらも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ビットアプリケーションに約1年ほど喜んで使用してきました。しかし、私は32ビットアプリケーションを作る必要があります。私はMASM32 proc memory_address()を呼び出す運がありません。

私はこれをNASMで32ビットアプリケーション用に行う方法を知っています。私はMASMを使用して64ビットアプリケーションを実行する方法を知っています。これは厳密に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/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"); 

    // .... 
関連する問題