茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    C#調(diào)用windows api的要點(diǎn)
    來(lái)源:易賢網(wǎng) 閱讀:1326 次 日期:2015-02-06 15:24:05
    溫馨提示:易賢網(wǎng)小編為您整理了“C#調(diào)用windows api的要點(diǎn)”,方便廣大網(wǎng)友查閱!

    在.Net Framework SDK文檔中,關(guān)于調(diào)用Windows API的指示比較零散,并且其中稍全面一點(diǎn)的是針對(duì)Visual Basic .net講述的。本文將C#中調(diào)用API的要點(diǎn)匯集如下,希望給未在C#中使用過(guò)API的朋友一點(diǎn)幫助。另外如果安裝了Visual Studio .net的話(huà),在C:/Program Files/Microsoft Visual Studio .NET/FrameworkSDK/Samples/Technologies/Interop/PlatformInvoke/WinAPIs/CS目錄下有大量的調(diào)用API的例子。

    一、調(diào)用格式

    using System.Runtime.InteropServices; //引用此名稱(chēng)空間,簡(jiǎn)化后面的代碼

    ...

    //使用DllImportAttribute特性來(lái)引入api函數(shù),注意聲明的是空方法,即方法體為空。

    [DllImport("user32.dll")]

    public static extern ReturnType FunctionName(type arg1,type arg2,...);

    //調(diào)用時(shí)候與調(diào)用其他方法并無(wú)區(qū)別

    DllImportAttribute特性的公共字段如下:

    1、CallingConvention 指示向非托管實(shí)現(xiàn)傳遞方法參數(shù)時(shí)所用的 CallingConvention 值。

    CallingConvention.Cdecl : 調(diào)用方清理堆棧。它使您能夠調(diào)用具有 varargs 的函數(shù)。

    CallingConvention.StdCall : 被調(diào)用方清理堆棧。它是從托管代碼調(diào)用非托管函數(shù)的默認(rèn)約定。

    2、CharSet 控制調(diào)用函數(shù)的名稱(chēng)版本及指示如何向方法封送 String 參數(shù)。

    此字段被設(shè)置為 CharSet 值之一。如果 CharSet 字段設(shè)置為 Unicode,則所有字符串參數(shù)在傳遞到非托管實(shí)現(xiàn)之前都轉(zhuǎn)換成 Unicode 字符。這還導(dǎo)致向 DLL EntryPoint 的名稱(chēng)中追加字母“W”。如果此字段設(shè)置為 Ansi,則字符串將轉(zhuǎn)換成 ANSI 字符串,同時(shí)向 DLL EntryPoint 的名稱(chēng)中追加字母“A”。大多數(shù) Win32 API 使用這種追加“W”或“A”的約定。如果 CharSet 設(shè)置為 Auto,則這種轉(zhuǎn)換就是與平臺(tái)有關(guān)的(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。CharSet 的默認(rèn)值為 Ansi。CharSet 字段也用于確定將從指定的 DLL 導(dǎo)入哪個(gè)版本的函數(shù)。CharSet.Ansi 和 CharSet.Unicode 的名稱(chēng)匹配規(guī)則大不相同。對(duì)于 Ansi 來(lái)說(shuō),如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話(huà),則返回“MyMethod”。如果 DLL 中沒(méi)有“MyMethod”,但存在“MyMethodA”,則返回“MyMethodA”。對(duì)于 Unicode 來(lái)說(shuō)則正好相反。如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話(huà),則返回“MyMethodW”。如果 DLL 中不存在“MyMethodW”,但存在“MyMethod”,則返回“MyMethod”。如果使用的是 Auto,則匹配規(guī)則與平臺(tái)有關(guān)(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。如果 ExactSpelling 設(shè)置為 true,則只有當(dāng) DLL 中存在“MyMethod”時(shí)才返回“MyMethod”。

    3、EntryPoint 指示要調(diào)用的 DLL 入口點(diǎn)的名稱(chēng)或序號(hào)。

    如果你的方法名不想與api函數(shù)同名的話(huà),一定要指定此參數(shù),例如:

    [DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]

    public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);

    4、ExactSpelling 指示是否應(yīng)修改非托管 DLL 中的入口點(diǎn)的名稱(chēng),以與 CharSet 字段中指定的 CharSet 值相對(duì)應(yīng)。如果為 true,則當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Ansi 值時(shí),向方法名稱(chēng)中追加字母 A,當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Unicode 值時(shí),向方法的名稱(chēng)中追加字母 W。此字段的默認(rèn)值是 false。

    5、PreserveSig 指示托管方法簽名不應(yīng)轉(zhuǎn)換成返回 HRESULT、并且可能有一個(gè)對(duì)應(yīng)于返回值的附加 [out, retval] 參數(shù)的非托管簽名。

    6、SetLastError 指示被調(diào)用方在從屬性化方法返回之前將調(diào)用 Win32 API SetLastError。 true 指示調(diào)用方將調(diào)用 SetLastError,默認(rèn)為 false。運(yùn)行時(shí)封送拆收器將調(diào)用 GetLastError 并緩存返回的值,以防其被其他 API 調(diào)用重寫(xiě)。用戶(hù)可通過(guò)調(diào)用 GetLastWin32Error 來(lái)檢索錯(cuò)誤代碼。

    二、參數(shù)類(lèi)型:

    1、數(shù)值型直接用對(duì)應(yīng)的就可。

    2、字符串指針(api) -> string (.net)

    3、句柄 (dWord) -> IntPtr

    4、結(jié)構(gòu) -> 結(jié)構(gòu)或者類(lèi)

    這種情況下,要先用StructLayout特性限定聲明,例如:

    // declared as class

    [ StructLayout( LayoutKind.Sequential )]

    public class OSVersionInfo

    {

    public int OSVersionInfoSize;

    public int majorVersion;

    public int minorVersion;

    public int buildNumber;

    public int platformId;

    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]

    public String versionString;

    }

    // declared as struct

    [ StructLayout( LayoutKind.Sequential )]

    public struct OSVersionInfo2

    {

    public int OSVersionInfoSize;

    public int majorVersion;

    public int minorVersion;

    public int buildNumber;

    public int platformId;

    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]

    public String versionString;

    }

    MashalAs特性:用于描述字段、方法或參數(shù)的封送處理格式。特性作為參數(shù)前綴并指定目標(biāo)需要的數(shù)據(jù)類(lèi)型。例如,以下代碼將兩個(gè)參數(shù)作為數(shù)據(jù)類(lèi)型長(zhǎng)指針?lè)馑徒o Windows API 函數(shù)的字符串 (LPStr):

    [MarshalAs(UnmanagedType.LPStr)]

    String existingfile;

    [MarshalAs(UnmanagedType.LPStr)]

    String newfile;

    注意結(jié)構(gòu)作為參數(shù)時(shí)候,一般前面要加上ref修飾符,否則會(huì)出現(xiàn)錯(cuò)誤:對(duì)象的引用沒(méi)有指定對(duì)象的實(shí)例。

    [ DllImport( "kernel32", EntryPoint="GetVersionEx" )]

    public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );

    三、如果在調(diào)用平臺(tái) invoke 后的任何位置都未引用托管對(duì)象,則垃圾回收器可能將完成該托管對(duì)象。這將釋放資源并使句柄無(wú)效,從而導(dǎo)致平臺(tái) invoke 調(diào)用失敗。用 HandleRef 包裝句柄可保證在平臺(tái) invoke 調(diào)用完成前,不對(duì)托管對(duì)象進(jìn)行垃圾回收。

    更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

    更多信息請(qǐng)查看數(shù)據(jù)庫(kù)
    易賢網(wǎng)手機(jī)網(wǎng)站地址:C#調(diào)用windows api的要點(diǎn)
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

    2026國(guó)考·省考課程試聽(tīng)報(bào)名

    • 報(bào)班類(lèi)型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專(zhuān)用圖標(biāo)
    聯(lián)系電話(huà):0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
    咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)