一 呼叫格式
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...