VC 動態鏈結庫 DLL 程式設計深入淺出 三

2021-05-11 00:37:15 字數 979 閱讀 4198

4.5 __stdcall約定

如果通過vc++編寫的dll欲被其他語言編寫的程式呼叫,應將函式的呼叫方式宣告為__stdcall方式,winapi都採用這種方式,而c/c++預設的呼叫方式卻為__cdecl。__stdcall方式與__cdecl對函式名最終生成符號的方式不同。若採用c編譯方式(在c++中需將函式宣告為extern "c"),__stdcall呼叫約定在輸出函式名前面加下劃線,後面加「@」符號和引數的位元組數,形如_functionname@number;而__cdecl呼叫約定僅在輸出函式名前面加下劃線,形如_functionname。

windows程式設計中常見的幾種函式型別宣告巨集都是與__stdcall和__cdecl有關的(節選自windef.h):

#define callback __stdcall //這就是傳說中的**函式

#define winapi __stdcall //這就是傳說中的winapi

#define winapiv __cdecl

#define apientry winapi //dllmain的入口就在這裡

#define apiprivate __stdcall

#define pascal __stdcall

在lib.h中,應這樣宣告add函式:

int __stdcall add(int x, int y);

在應用工程中函式指標型別應定義為:

typedef int(__stdcall *lpaddfun)(int, int);

若在lib.h中將函式宣告為__stdcall呼叫,而應用工程中仍使用typedef int (* lpaddfun)(int,int),執行時將發生錯誤(因為型別不匹配,在應用工程中仍然是預設的__cdecl呼叫),彈出如圖7所示的對話方塊。

圖7 呼叫約定不匹配時的執行錯誤

圖8中的那段話實際上已經給出了錯誤的原因,即「this is usually a result of …」。

VC 動態鏈結庫 DLL 程式設計深入淺出 一

1.概論 先來闡述一下dll dynamic linkable library 的概念,你可以簡單的把dll看成一種倉庫,它提供給你一些可以直接拿來用的變數 函式或類。在倉庫的發展史上經歷了 無庫 靜態鏈結庫 動態鏈結庫 的時代。2.靜態鏈結庫 對靜態鏈結庫的講解不是本文的重點,但是在具體講解dll...

VC 動態鏈結庫 DLL 程式設計深入淺出 二

4.2 宣告匯出函式 dll 中匯出函式的宣告有兩種方式 一種為4.1節例子中給出的在函式宣告中加上 declspec dllexport 這裡不再舉例說明 另外一種方式 是採用模組定義 def 檔案宣告,def檔案為鏈結器提供了有關被鏈結程式的匯出 屬性及其他方面的資訊。下面的 演示了 怎樣同.d...

VC 動態鏈結庫 DLL 程式設計深入淺出 一

1.概論 先來闡述一下dll dynamic linkable library 的概念,你可以簡單的把dll看成一種倉庫,它提供給你一些可以直接拿來用的變數 函式或類。在倉庫的發展史上經歷了 無庫 靜態鏈結庫 動態鏈結庫 的時代。圖1 建立乙個靜態鏈結庫 並新建lib.h和lib.cpp兩個檔案,l...