一文了解 Windows程式設計 常見關鍵字和概念

2021-10-09 05:25:39 字數 2425 閱讀 9836

2. dllimport 和 dllexport

工作了三年,都是在linux化境下做開發,最近開始接觸windows環境開發,常常被一些windows程式設計的關鍵字搞得很懵,於是決定,好好的總結一下平時windows環境程式設計遇到的一些概念。本文會持續更新,爭取將最常用的windows程式設計的概念整理清楚。

函式的呼叫約定,顧名思義就是對函式呼叫的乙個約束和規定(規範),描述了函式引數是怎麼傳遞和由誰清除堆疊的。它決定以下內容:

常見的函式定義

int function(int a, int b);
這種書寫方式,沒有顯式的說明呼叫約定,編譯器會默人我們使用__cdecl約定。

另一種函式定義方式

int __stdecall function(int a, int b);
這種定義方式顯式的指出了函式呼叫約定的規則是__stdcall

接下來,具體分析一下這幾種呼叫規則的含義:

常見的呼叫約定有__cdecl、__stdcall、fastcall

__cdecl 是 c declaration 的縮寫,表示 c 和 c++ 預設的函式呼叫約定。是c/c++和mfcx的預設呼叫約定。

__stdcall是standard call的縮寫,是c++的標準呼叫方式,當然這是微軟定義的標準,__stdcall通常用於win32 api中(可檢視winapi的定義)。

__fastcall呼叫的主要特點就是快,因為它是通過暫存器來傳送引數的。

__thiscall是c++類成員函式預設的呼叫約定,但它沒有顯示的宣告形式。因為在c++類中,成員函式呼叫還有乙個this指標引數,因此必須特殊處理,thiscall呼叫約定的特點:

幾種呼叫約定的比較

專案__cdecl

__stdcall

__fastcall

引數傳遞方式

右->左

右->左

左邊開始的兩個不大於4位元組(dword)的引數分別放在ecx和edx暫存器,其餘的引數自右向左壓棧傳送

清理棧方

呼叫者清理

被呼叫函式清理

被呼叫函式清理

適用場合

c/c++、mfc的預設方式; 可變引數的時候使用;

win api

要求速度快,適用於對效能要求較高的場合。

c編譯修飾約定

_functionname

_functionname@number

@functionname@number

__declspec是microsoft vc中專用的關鍵字,它配合著一些屬性可以對標準c/c++進行擴充。

__declspec(dllexport)用於windows中的動態庫中,宣告匯出函式、類、物件等供外面呼叫,省略給出.def檔案。即將函式、類等宣告為匯出函式,供其它程式呼叫,作為動態庫的對外介面函式、類等。

.def檔案(模組定義檔案)是包含乙個或多個描述各種dll屬性的module語句的文字檔案。.def檔案或__declspec(dllexport)都是將公共符號匯入到應用程式或從dll匯出函式。如果不提供__declspec(dllexport)匯出dll函式,則dll需要提供.def檔案。

宣告乙個匯出函式,是說這個函式要從本dll匯出。我要給別人用。一般用於dll中

省掉在def檔案中手工定義匯出哪些函式的乙個方法。當然,如果你的dll裡全是c++的類的話,你無法在def裡指定匯出的函式,只能用__declspec(dllexport)匯出類

__declspec(dllimport)用於windows中,從別的動態庫中宣告匯入函式、類、物件等供本動態庫或exe檔案使用。

宣告乙個匯入函式,是說這個函式是從別的dll匯入。我要用。一般用於使用某個dll的exe中

不使用 __declspec(dllimport) 也能正確編譯**,但使用 __declspec(dllimport) 使編譯器可以生成更好的**。編譯器之所以能夠生成更好的**,是因為它可以確定函式是否存在於 dll 中,這使得編譯器可以生成跳過間接定址級別的**,而這些**通常會出現在跨 dll 邊界的函式呼叫中。但是,必須使用 __declspec(dllimport) 才能匯入 dll 中使用的變數。

關鍵字含義

dllexport

將當前動態庫的介面匯出,供別的程式使用

dllimport

將別的動態庫的介面匯入到當前程式,供當前使用

#define libscrender_api __declspec (dllexport)

libscrender_api int __stdcall sum(int a, int b)

持續更新……

一文了解Flink State Backends

當我們使用flink進行流式計算時,通常會產生各種形式的中間結果,我們稱之為state。有狀態產生,就必然涉及到狀態的儲存,那麼flink中定義了哪些形式的狀態儲存呢,下面一一給大家介紹一下。顧名思義,memorystatebackend狀態後端是將狀態資料以object的形式存放於j a heap...

一文了解Perl語言

perl,一種功能豐富的計算機程式語言,執行在超過100種計算機平台上,適用廣泛,從大型機到便攜裝置,從快速原型建立到大規模可擴充套件開發。1 perl最初的設計者為拉里 沃爾 larry wall 於1987年12月18日發表。現在的版本為perl 6,於2015年12月25日更新。perl借取了...

一文了解Perl語言

perl,一種功能豐富的計算機程式語言,執行在超過100種計算機平台上,適用廣泛,從大型機到便攜裝置,從快速原型建立到大規模可擴充套件開發。1 perl最初的設計者為拉里 沃爾 larry wall 於1987年12月18日發表。現在的版本為perl 6,於2015年12月25日更新。perl借取了...