C 中運用API函式獲取系統資訊

2022-03-27 13:08:39 字數 2793 閱讀 1348

api函式是構築windows應用程式的基石,是windows程式設計的必備利器。每一種windows應用程式開發工具都提供了間接或直接呼叫了windows api函式的方法,或者是呼叫windows api函式的介面,也就是說具備呼叫動態連線庫的能力。visual c#和其它開發工具一樣也能夠呼叫動態鏈結庫的api函式。本文中筆者就結合例項向大家介紹在visual c#中如何呼叫各種返回值的api,該例項就是乙個通過api函式呼叫獲取系統資訊的程式。 

在visual c#中呼叫api的基本過程:

首先,在呼叫api之前,你必須先導入system.runtime.interopservices這個命名空間。該命名空間包含了在visual c#中呼叫api的一些必要集合,具體的方法如下: 

using system.runtime.interopservices; 

在匯入了命名空間後,我們要宣告在程式中所要用到的api函式。我們的程式主要是獲取系統的相關資訊,所以用到的api函式都是返回系統資訊的。先給出在visual c#中宣告api的方法: 

[dllimport("kernel32")] 

public static extern void getwindowsdirectory(stringbuilder windir,int count);

其中,"dllimport"屬性用來從不可控**中呼叫乙個方法,它指定了dll的位置,該dll中包含呼叫的外部方法;"kernel32"設定了類庫名;"public"指明函式的訪問型別為公有的;"static"修飾符宣告乙個靜態元素,而該元素屬於型別本身而不是指定的物件;"extern"表示該方法將在工程外部執行,同時使用dllimport匯入的方法必須使用"extern"修飾符;最後getwindowsdirectory函式包含了兩個引數,乙個為stringbuilder型別的,另乙個為int型別的,該方法返回的內容存在於stringbuilder型別的引數中。同時,因為我們在這裡使用到了stringbuilder類,所以在程式的開始處,我們還得新增system.text這個命名空間,方法同上。 

其他幾個api函式的宣告如下: 

[dllimport("kernel32")] 

public static extern void getsystemdirectory(stringbuilder sysdir,int count); 

[dllimport("kernel32")] 

public static extern void getsysteminfo(ref cpu_info cpuinfo); 

[dllimport("kernel32")] 

public static extern void globalmemorystatus(ref memory_info meminfo); 

[dllimport("kernel32")] 

public static extern void getsystemtime(ref systemtime_info stinfo);

以上幾個api的作用分別是獲取系統路徑,獲得cpu相關資訊,獲得記憶體的相關資訊,獲得系統時間等。 

在宣告完所有的api函式後,我們發現後三個函式分別用到了cpu_info、memory_info、systemtime_info等結構,這些結構並非是.net內部的,它們從何而來?其實,我們在用到以上api呼叫時均需用到以上結構,我們將函式呼叫獲得的資訊存放在以上的結構體中,最後返回給程式輸出。這些結構體比較複雜,但是如果開發者能夠熟練運用,那麼整個api世界將盡在開發者的掌握之中。以下就是上述結構體的宣告: 

1

//定義以下各結構 2//

定義cpu的資訊結構

3 [structlayout(layoutkind.sequential)]

4public

struct cpu_info

5 17

18//

定義記憶體的資訊結構

19 [structlayout(layoutkind.sequential)]

20public

struct memory_info

21

3132

//定義系統時間的資訊結構

33 [structlayout(layoutkind.sequential)]

34public

struct systemtime_info

35

layoutkind.automatic:為了提高效率允許執行態對型別成員重新排序。 

注意:永遠不要使用這個選項來呼叫不受管轄的動態鏈結庫函式。 

layoutkind.explicit:對每個域按照fieldoffset屬性對型別成員排序 

layoutkind.sequential:對出現在受管轄型別定義地方的不受管轄記憶體中的型別成員進行排序。 

在上面的程式中,為了方便起見我們都用到了第三種方式。

所有的api函式以及相關的結構體宣告完畢後,我們就運用這些api來實現我們的程式功能――獲取系統的相關資訊。 

介面可按如下方式布置,不過有興趣的讀者自然可以發揮自己的想象,將介面布局做得更好。

簡單的介面布置好後,我們新增乙個按鈕("獲取資訊"按鈕)的訊息處理函式如下: 

1

private

void getinfo_click(object sender, system.eventargs e)

2

在上面的訊息處理函式中,我們運用了在程式開始處宣告的各個api函式獲取了系統的相關資訊,並最終在介面上以文字標籤的方式顯示結果。各個文字標籤的命名方式可以參見文後附帶的源**,此處暫略。 

最後,執行程式如下: 

在Visual C 中運用API函式獲取系統資訊

api函式是構築windows應用程式的基石,是windows程式設計的必備利器。每一種windows應用程式開發工具都提供了間接或直接呼叫了windows api函式的方法,或者是呼叫windows api函式的介面,也就是說具備呼叫動態連線庫的能力。visual c 中如何呼叫各種返回值的api...

在Visual C 中運用API函式獲取系統資訊

api函式是構築windows應用程式基石,是windows程式設計必備利器。每一種windows應用程式開發工具都提供了間接或直接呼叫了windows api函式方法,或者是呼叫windows api函式介面,也就是說具備呼叫動態連線庫能力。visual c 和其它開發工具一樣也能夠呼叫動態鏈結庫...

在Visual C 中運用API函式獲取系統資訊

api函式是構築windows應用程式的基石,是windows程式設計的必備利器。每一種windows應用程式開發工具都提供了間接或直接呼叫了windows api函式的方法,或者是呼叫windows api函式的介面,也就是說具備呼叫動態連線庫的能力。visual c 中如何呼叫各種返回值的api...