C 呼叫windowsAPI函式

2022-08-05 06:06:10 字數 2956 閱讀 3191

一 呼叫格式

c#在呼叫windowsapi函式介面的時候有一套專門的呼叫流程

首先我們在呼叫api函式的時候必須引用命名空間interopservices

using system.runtime.interopservices;

例如我們想呼叫windows的kernel32.dll動態庫中的介面函式中的allocconsole()控制台函式介面

下面我們用最簡單的呼叫形式來宣告呼叫此函式介面(空方法,即方法體為空)

[dllimport("kernel32.dll")]

public static extern bool allocconsole();

下面我們可以用dllimportattribute特性新增字段進一步說明

1callingconvention

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

callingconvention.cded:呼叫方清理堆疊。他使用你能夠呼叫具有varargs的函式

callingconvention.stdcall:被呼叫方清理堆疊。他是從託管**呼叫非託管函式的預設約定

2charset

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

charset.ansi:所有字串轉換成ansi字串,同時向dll enterpoint的名稱中追加字母」a「

charset.unicode:所有字串引數在傳遞到非託管實現之前都轉換成unicode字元;向dll enterpoint的名稱中追加字母"w"

charset.auto:這種轉換就與平台有關(例如在windows nt上位unicode,而在windows 98上為ansi)。

charset的預設值為ansi

3 enterpoint

指示要呼叫的dll入口點的名稱或序號

如果你的方法名不想與api函式同名的話,一定要指定此引數

例如我想呼叫user32.dll中的messagebox函式但是我想以自己的名字msgbox名字來命名的話

[dllimport("user32.dll",charset="charset.auto",enterpoint="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 serlasterror

指示被呼叫方法從屬性化方法返回值之前呼叫win32 api setlasterror。

true指示呼叫方將呼叫setlasterror,預設為false。執行時封送拆收器呼叫getlasterror並快取返回的值,以防其他api呼叫重寫。

二 引數型別轉換

c++c#

dword

intword

int16

字串指標型別

string

控制代碼(handle、hwnd)

intptr

結構或者類

要先用structlayout特性限定宣告結構或類

1 explicit

用於控制每個資料成員的精確位置。利用explicit,每個成員必須使用fieldoffsetattribute指示此字段在型別中的位置:

[structlayout(layoutkind.explicit, size=16, charset=charset.ansi)]

public

class mysystemtime

2 sequential

用於強制將成員按出現的順序進行順序布局

例如針對api中的osversioninfo結構,在.net中定義類或者結構的例子如下

api原型

* api中定義原結構宣告

* osversioninfoa struct

* dwosversioninfosize dword

?* dwmajorversion dword ?

* dwminorversion

dword ?

* dwbuildnumber dword ?

* dwplatformid dword ?

* szcsdversion byte 128 dup

(?)* osversioninfoa ends

** osversioninfo equ

在.net中宣告如下

[ structlayout( layoutkind.sequential )]

public class osversioninfo

注意:結構作為引數的時候,一般前面要加上ref修飾符,否則會出現錯誤:物件的引用沒有指定物件的例項

在C 中呼叫windows API函式

在c 中呼叫windows api函式 對於windows 系統api函式的呼叫在程式設計中有時是必不可少的,各種程式語言都規範了呼叫的方法和介面,在c 語言中的呼叫方法如下 以下程式設計環境為visual studio net 1 在工程專案中新增乙個類新項,開啟這個類檔案,在檔案頭部加入對以下命...

C 呼叫windows api示例

這是執行結果 api函式是構築windws應用程式的基石,每一種windows應用程式開發工具,它提 供的底層函式都間接或直接地呼叫了windows api函式,同時為了實現功能擴 展,一般也都提供了呼叫windowsapi函式的介面,也就是說具備呼叫動態連線 庫的能力。visual c 和其它開發...

C 呼叫WINDOWS API 示例

一 呼叫windowsapi。c 下呼叫windows api方法如下 1 引入命名空間 using system.runtime.interopservices 2 引用需要使用的方法,格式 dllimport dll檔案 方法的宣告 dllimport user32.dll private st...