彙編與VC (c or c++)之間的嵌套調用

第一:VCDll  asm調用

Dll:

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call,

                       LPVOID lpReserved)

{return TRUE;}

extern "C" int sortBuf(char* pBuf)

{…函數實現}

DEF:

EXPORTS

    sortBuf @1

編譯後生成xx.dll 和對應的xx.lib文件

 

Asm調用

關鍵1:

Includelib xx.lib

關鍵點2:

sortBuf proto C :DWORD 

調用invoke sortBuf,offset g_StrBuf

 

總結 最主要的有以下幾點

1:dll與調用模塊命名約定和函數的調用約定要相同

  一般dll中在函數前用extern "C"修飾 ,

2:如果在dll中使用__cdcel調用約定 則在asm中聲明時需要用 C 修飾 

   因爲asm中通過.model flat,stdcall 說明了默認的調用約定爲__stdcall

3:asm中包含xx.lib頭文件

 

 

第二:asm生成dll

Asm Dll

;ASM版彙編

.386

.model flat,stdcall

option casemap:none

 

   include windows.inc

   include user32.inc

   include kernel32.inc

  

   includelib User32.lib

   includelib kernel32.lib

 

 

.code

;DllMain必須的 而且 end DllMain也是必須的

DllMain proc  hModule:DWORD,ul_reason_for_call:DWORD,lpReserved:DWORD

    ret   

DllMain endp

 

;導出函數

ShowMsg proc lpText:DWORD,lpCaption:DWORD

    invoke MessageBox,NULL,lpText,lpCaption,MB_OK

ShowMsg endp

 

end DllMain

 

Def文件

EXPORTS

      ShowMsg   @1

鏈接後產生.dll.lib文件

關鍵部分 :ASMdll.asm 編譯後 Asmdll.obj asmdll.def的鏈接語句如下

link32 /DLL /subsystem:windows /def:asmdll.def asmdll.obj

注意:asm默認生成的函數是__stdcall約定 所以在使用dll時應該注意

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章