日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

C#調(diào)用windows api的要點(diǎn)_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:PHP更新數(shù)據(jù)庫記錄
//更新記錄 $query=insert into chinachaodai (name,theindex)values ('公司','1'); $result=$mysqli-query($query); if($result) { echo (返回行數(shù):.$mysqli-affected_rows); } else { echo(失敗了); } $mysqli-close();

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

  一、調(diào)用格式

  using System.Runtime.InteropServices; //引用此名稱空間,簡化后面的代碼

  ...

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

  [DllImport("user32.dll")]

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

  //調(diào)用時(shí)候與調(diào)用其他方法并無區(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ù)的名稱版本及指示如何向方法封送 String 參數(shù)。

  此字段被設(shè)置為 CharSet 值之一。如果 CharSet 字段設(shè)置為 Unicode,則所有字符串參數(shù)在傳遞到非托管實(shí)現(xiàn)之前都轉(zhuǎn)換成 Unicode 字符。這還導(dǎo)致向 DLL EntryPoint 的名稱中追加字母“W”。如果此字段設(shè)置為 Ansi,則字符串將轉(zhuǎn)換成 ANSI 字符串,同時(shí)向 DLL EntryPoint 的名稱中追加字母“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 的名稱匹配規(guī)則大不相同。對(duì)于 Ansi 來說,如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話,則返回“MyMethod”。如果 DLL 中沒有“MyMethod”,但存在“MyMethodA”,則返回“MyMethodA”。對(duì)于 Unicode 來說則正好相反。如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話,則返回“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)的名稱或序號(hào)。

  如果你的方法名不想與api函數(shù)同名的話,一定要指定此參數(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)的名稱,以與 CharSet 字段中指定的 CharSet 值相對(duì)應(yīng)。如果為 true,則當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Ansi 值時(shí),向方法名稱中追加字母 A,當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Unicode 值時(shí),向方法的名稱中追加字母 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)用重寫。用戶可通過調(diào)用 GetLastWin32Error 來檢索錯(cuò)誤代碼。

  二、參數(shù)類型:

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

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

  3、句柄 (dWord) -> IntPtr

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

  這種情況下,要先用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ù)類型。例如,以下代碼將兩個(gè)參數(shù)作為數(shù)據(jù)類型長指針封送給 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ì)象的引用沒有指定對(duì)象的實(shí)例。

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

  public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );

 

分享:PHP開發(fā)注意事項(xiàng)總結(jié)
1.使用內(nèi)嵌的HTML代碼,而不是PHP的echo語句。 因?yàn)镻HP是一門嵌入式Web編程語言,可以將HTML代碼和PHP代碼相互嵌入。但是很多程序員擔(dān)心在HTML代碼中過多的使用嵌入PHP代碼會(huì)多次調(diào)用PHP解釋器,從而降低了PHP代碼的運(yùn)行速度,所以寧愿使用PHP的echo語句來輸出HTML代碼

共2頁上一頁12下一頁
來源:模板無憂//所屬分類:PHP教程/更新時(shí)間:2015-02-06
相關(guān)PHP教程