在C 中呼叫API的基本過程

2021-06-01 09:07:29 字數 2457 閱讀 3014

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

using system.runtime.interopservices;

[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世界將盡在開發者的掌握之中。以下就是上述結構體的宣告:

//定義以下各結構

//定義cpu的資訊結構

[structlayout(layoutkind.sequential)]

public struct cpu_info

//定義記憶體的資訊結構

[structlayout(layoutkind.sequential)]

public struct memory_info

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

[structlayout(layoutkind.sequential)]

public struct systemtime_info

結構體定義的主體部分和c++中的沒多大差別,具體每個結構體內部成員的定義可參考聯機幫助中的sdk文件。同時,我們還發現在每個結構體定義的上面都有一句用中括號括起來的說明性文字。這些說明都是有關結構體成員的布局的,共有三種選項,分別說明如下:

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

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

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

在上面的程式中,為了方便起見我們都用到了第三種方式所有的api函式以及相關的結構體宣告完畢後,我們就運用這些api來實現我們的程式功能――獲取系統的相關資訊。

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

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

private void getinfo_click(object sender, system.eventargs e)

怎樣在C 中呼叫儲存過程?

廢話不說,直接切入主題。先來說下儲存過程的幾種情況 1 沒有引數沒有返回值 2 有引數沒有返回值 3 有引數有返回值 下面就這幾種情況分別舉例 1 沒有引數沒有返回值象這種情況最簡單。儲存過程 use northwind create proc novaluenoparameter asselect...

在ASP中呼叫儲存過程

dim objcnn dim objcmd dim rs const o id 112 建立connection物件 set objcnn server.createobject adodb.connection objcnn.open driver server localhost uid sa ...

在PB script 中呼叫儲存過程

在pb script中呼叫儲存過程有兩種方式 一是直接在指令碼中編寫語句呼叫儲存過程。一般語句如下 declare name procedure for pro indatabase 引數1,引數2,if sqlca.sqlcode 0 then messagebox pro indatabase ...