C 中呼叫Windows API的要點

2021-06-15 22:26:19 字數 3625 閱讀 2818

.net framework sdk

文件中,關於呼叫

windows api

的指示比較零散,並且其中稍全面一點的是針對

visual basic .net

講述的。本文將

c#中呼叫

api的要點匯集如下,希望給未在

c#中使用過

api的朋友一點幫助。另外如果安裝了

visual studio .net

的話,在

c:/program files/microsoft visual studio .net/frameworksdk/samples/technologies/interop/platforminvoke/winapis/cs

目錄下有大量的呼叫

api的例子。

一、呼叫格式

using system.runtime.interopservices; //

引用此命名空間,簡化後面的**

...//

使用dllimportattribute

特性來引入

api函式,注意宣告的是空方法,即方法體為空。

[dllimport("user32.dll")]

public static extern returntype functionname(type arg1,type arg2,...);

//呼叫時與呼叫其他方法並無區別

可以使用字段進一步說明特性,用逗號隔開,如:

[ dllimport( "kernel32", entrypoint="getversionex" )]

dllimportattribute

特性的公共字段如下:1、

callingconvention

指示向非託管實現傳遞方法引數時所用的

callingconvention

值。callingconvention.cdecl :

呼叫方清理堆疊。它使您能夠呼叫具有

varargs

的函式。

callingconvention.stdcall :

被呼叫方清理堆疊。它是從託管**呼叫非託管函式的預設約定。 2

、charset

控制呼叫函式的名稱版本及指示如何向方法封送

string

引數。

此字段被設定為

charset

值之一。如果

charset

字段設定為

unicode

,則所有字串引數在傳遞到非託管實現之前都轉換成

unicode

字元。這還導致向

dll entrypoint

的名稱中追加字母

「w」。如果此欄位設定為

ansi

,則字串將轉換成

ansi

字串,同時向

dll entrypoint

的名稱中追加字母

「a」。

大多數win32 api

使用這種追加

「w」或

「a」的約定。如果

charset

設定為auto

,則這種轉換就是與平台有關的(在

windows nt

上為unicode

,在windows 98

上為ansi

)。charset

的預設值為

ansi

。charset

欄位也用於確定將從指定的

dll

匯入哪個版本的函式。

charset.ansi

和charset.unicode

的名稱匹配規則大不相同。對於

ansi

來說,如果將

entrypoint

設定為「mymethod」

且它存在的話,則返回

「mymethod」

。如果dll

中沒有「mymethod」

,但存在

「mymethoda」

,則返回

「mymethoda」。

對於unicode

來說則正好相反。如果將

entrypoint

設定為「mymethod」

且它存在的話,則返回

「mymethodw」

。如果dll

中不存在

「mymethodw」

,但存在

「mymethod」

,則返回

「mymethod」

。如果使用的是

auto

,則匹配規則與平台有關(在

windows nt

上為unicode

,在windows 98

上為ansi

)。如果

exactspelling

設定為true

,則只有當

dll

中存在「mymethod」

時才返回

「mymethod」。

3、entrypoint

指示要呼叫的

dll

入口點的名稱或序號。

如果你的方法名不想與

api函式同名的話,一定要指定此引數

,例如:

[dllimport("user32.dll",charset="charset.auto",entrypoint="messagebox")]

public static extern int msgbox(intptr hwnd,string txt,string caption, int type);

4、exactspelling

指示是否應修改非託管

dll

中的入口點的名稱,以與

charset

欄位中指定的

charset

值相對應。如果為

true

,則當dllimportattribute.charset

字段設定為

charset

的ansi

值時,向方法名稱中追加字母a,當

dllimportattribute.charset

字段設定為

charset

的unicode

值時,向方法的名稱中追加字母

w。此字段的預設值是

false。

5、preservesig

指示託管方法簽名不應轉換成返回

hresult

、並且可能有乙個對應於返回值的附加

[out, retval]

引數的非託管簽名。 6

、setlasterror

指示被呼叫方在從屬性化方法返回之前將呼叫

win32 api setlasterror

。true

指示呼叫方將呼叫

setlasterror

,預設為

false

。執行時封送拆收器將呼叫

getlasterror

並快取返回的值,以防其被其他

api

呼叫重寫。使用者可通過呼叫

getlastwin32error

來檢索錯誤**。

C 中呼叫Windows API的要點

在.net framework sdk文件中,關於呼叫windows api的指示比較零散,並且其中稍全面一點的是針對visual basic net講述的。本文將c 中呼叫api的要點匯集如下,希望給未在c 中使用過api的朋友一點幫助。另外如果安裝了visual studio net的話,在c ...

C 中呼叫Windows API的要點

c 中呼叫windows api的要點 在.net framework sdk文件中,關於呼叫windows api的指示比較零散,並且其中稍全面一點的是針對visual basic net講述的。本文將c 中呼叫api的要點匯集如下,希望給未在c 中使用過api的朋友一點幫助。另外如果安裝了vis...

C 中呼叫Windows API的要點

在.net framework sdk文件中,關於呼叫windows api的指示比較零散,並且其中稍全面一點的是針對visual basic net講述的。本文將c 中呼叫api的要點匯集如下,希望給未在c 中使用過api的朋友一點幫助。另外如果安裝了visual studio net的話,在c ...