青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 330537
  • 排名 - 74

最新評論

閱讀排行榜

評論排行榜

.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 的默認值為 AnsiCharSet 字段也用于確定將從指定的 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”

 3EntryPoint 指示要調用的 DLL 入口點的名稱或序號。 
  
如果你的方法名不想與api函數同名的話,一定要指定此參數,例如:
 [DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]
 public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);

 4ExactSpelling 指示是否應修改非托管 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 來檢索錯誤代碼。

二、參數類型:
 1
、數值型直接用對應的就可。(DWORD -> int , WORD -> Int16
 2
API中字符串指針類型 -> .netstring
 3
API中句柄 (dWord)  -> .netIntPtr
 4
API中結構   -> .net中結構或者類。注意這種情況下,要先用StructLayout特性限定聲明結構或類
公共語言運行庫利用StructLayoutAttribute控制類或結構的數據字段在托管內存中的物理布局,即類或結構需要按某種方式排列。如果要將類傳遞給需要指定布局的非托管代碼,則顯式控制類布局是重要的。它的構造函數中用LayoutKind值初始化 StructLayoutAttribute 類的新實例。 LayoutKind.Sequential 用于強制將成員按其出現的順序進行順序布局。
 LayoutKind.Explicit
用于控制每個數據成員的精確位置。利用 Explicit 每個成員必須使用 FieldOffsetAttribute 指示此字段在類型中的位置。如:
 [StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
 public class MySystemTime 
 {
    [FieldOffset(0)]public ushort wYear; 
    [FieldOffset(2)]public ushort wMonth;
    [FieldOffset(4)]public ushort wDayOfWeek; 
    [FieldOffset(6)]public ushort wDay; 
    [FieldOffset(8)]public ushort wHour; 
    [FieldOffset(10)]public ushort wMinute; 
    [FieldOffset(12)]public ushort wSecond; 
    [FieldOffset(14)]public ushort wMilliseconds; 
 }
 
下面是針對APIOSVERSIONINFO結構,在.net中定義對應類或結構的例子:
/**********************************************
* API
中定義原結構聲明
* OSVERSIONINFOA STRUCT
*  dwOSVersionInfoSize   DWORD      ?
*  dwMajorVersion        DWORD      ?
*  dwMinorVersion        DWORD      ?
*  dwBuildNumber         DWORD      ?
*  dwPlatformId          DWORD      ?
*  szCSDVersion          BYTE 128 dup (?)
* OSVERSIONINFOA ENDS
*
* OSVERSIONINFO  equ  <OSVERSIONINFOA>
*********************************************/

//.net中聲明為類
[ 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;
}
//
或者
//.net
中聲明為結構
[ 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特性,它用于描述字段、方法或參數的封送處理格式。用它作為參數前綴并指定目標需要的數據類型。例如,以下代碼將兩個參數作為數據類型長指針封送給 Windows API 函數的字符串 (LPStr) 
    [MarshalAs(UnmanagedType.LPStr)]
 String existingfile;
    [MarshalAs(UnmanagedType.LPStr)]
 String newfile;

 注意結構作為參數時候,一般前面要加上ref修飾符,否則會出現錯誤:對象的引用沒有指定對象的實例。
 [ DllImport( "kernel32", EntryPoint="GetVersionEx" )] 
 public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );

三、如何保證使用托管對象的平臺調用成功?
   
如果在調用平臺 invoke 后的任何位置都未引用托管對象,則垃圾回收器可能將完成該托管對象。這將釋放資源并使句柄無效,從而導致平臺invoke 調用失敗。用 HandleRef 包裝句柄可保證在平臺 invoke 調用完成前,不對托管對象進行垃圾回收。
   
例如下面:
        FileStream fs = new FileStream( "a.txt", FileMode.Open );
        StringBuilder buffer = new StringBuilder( 5 );
        int read = 0;
        ReadFile(fs.Handle, buffer, 5, out read, 0 ); //
調用Win API中的ReadFile函數
 
由于fs是托管對象,所以有可能在平臺調用還未完成時候被垃圾回收站回收。將文件流的句柄用HandleRef包裝后,就能避免被垃圾站回收:
 [ DllImport( "Kernel32.dll" )]
 public static extern bool ReadFile( 
  HandleRef hndRef, 
  StringBuilder buffer, 
  int numberOfBytesToRead, 
  out int numberOfBytesRead, 
  ref Overlapped flag );
 ......
 ......
        FileStream fs = new FileStream( "HandleRef.txt", FileMode.Open );
        HandleRef hr = new HandleRef( fs, fs.Handle );
        StringBuilder buffer = new StringBuilder( 5 );
        int read = 0;
        // platform invoke will hold reference to HandleRef until call ends
        ReadFile( hr, buffer, 5, out read, 0 );

 

posted on 2009-12-25 12:54 baby-fly 閱讀(249) 評論(0)  編輯 收藏 引用 所屬分類: C#
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人在线免费观看| 在线播放精品| 久久动漫亚洲| 欧美亚洲一区在线| 久久国产88| 鲁大师影院一区二区三区| 欧美v亚洲v综合ⅴ国产v| 欧美激情视频网站| 国产精品都在这里| 经典三级久久| 一区二区三区波多野结衣在线观看| 亚洲午夜久久久久久久久电影院| 亚洲欧美日本视频在线观看| 狂野欧美性猛交xxxx巴西| 亚洲国产精品专区久久| 日韩一二三在线视频播| 欧美在线免费观看视频| 免费试看一区| 国产精品免费视频xxxx| 亚洲国产精品激情在线观看| 在线亚洲欧美专区二区| 久久综合网hezyo| 99riav久久精品riav| 久久久亚洲精品一区二区三区| 欧美理论电影在线观看| 在线成人中文字幕| 欧美在线视频观看| 亚洲乱码视频| 欧美天堂亚洲电影院在线播放| 国产片一区二区| 91久久综合亚洲鲁鲁五月天| 欧美伊人久久| 91久久国产综合久久91精品网站| 亚洲欧美福利一区二区| 欧美激情综合在线| 1769国内精品视频在线播放| 性色av一区二区三区红粉影视| 亚洲第一成人在线| 久久精品人人爽| 国产日韩在线视频| 亚洲综合不卡| 亚洲精品影视| 欧美成人免费在线观看| 在线不卡a资源高清| 久久精品国产清自在天天线| 一区二区三区成人| 欧美日韩精品是欧美日韩精品| 亚洲国产天堂网精品网站| 狂野欧美激情性xxxx| 欧美一区二区性| 国产亚洲欧美日韩精品| 久久精品视频导航| 欧美在线免费视频| 国产亚洲精品高潮| 久久久精品一品道一区| 亚洲欧美精品伊人久久| 国产精品久久午夜夜伦鲁鲁| 亚洲网站在线观看| 亚洲视频综合在线| 国产精品久久久久久久9999| 亚洲免费视频在线观看| 亚洲视频在线观看一区| 国产精品男女猛烈高潮激情| 亚洲婷婷综合久久一本伊一区| 日韩视频免费观看高清在线视频| 欧美日韩18| 性欧美18~19sex高清播放| 午夜精品久久久久久久99水蜜桃 | 亚洲一区在线观看视频 | 欧美电影在线免费观看网站| 久久久久久香蕉网| 亚洲高清资源| 亚洲精品久久久久久久久久久| 欧美凹凸一区二区三区视频| 99国产精品99久久久久久| 亚洲精品一级| 国产精品亚洲人在线观看| 久久成人羞羞网站| 久久夜色精品| 一区二区三区日韩欧美| 久久人体大胆视频| 欧美成年人网| 欧美精品入口| 欧美一区日韩一区| 欧美在线视频全部完| 亚洲高清久久| av不卡在线看| 国内精品免费午夜毛片| 亚洲国产欧美日韩| 国产精品久久网站| 欧美成人在线网站| 国产精品视频99| 欧美成人午夜77777| 国产精品h在线观看| 久久人人97超碰人人澡爱香蕉 | 欧美电影免费观看高清| 亚洲综合日韩中文字幕v在线| 欧美一区二区福利在线| 99www免费人成精品| 久久激情中文| 亚洲在线成人精品| 麻豆国产精品va在线观看不卡| 亚洲永久在线| 模特精品裸拍一区| 久久久久久国产精品mv| 欧美午夜一区二区三区免费大片 | 亚洲欧美一区二区视频| 最新亚洲激情| 久久er99精品| 欧美一区三区二区在线观看| 欧美日韩国产成人在线观看| 久久综合免费视频影院| 国产精品色网| 中文国产亚洲喷潮| 艳妇臀荡乳欲伦亚洲一区| 久久久.com| 久久精品国产精品| 国产精品自在线| 亚洲一区视频在线| 午夜久久一区| 国产精品一国产精品k频道56| 亚洲人www| 亚洲精品日韩在线观看| 久热国产精品| 欧美高清一区| 亚洲国产精品久久久久婷婷老年| 欧美一级专区免费大片| 香蕉久久夜色精品| 欧美午夜性色大片在线观看| 日韩视频三区| 亚洲欧美视频在线| 国产精品视频免费观看| 亚洲深夜福利在线| 亚洲综合首页| 国产精品亚洲аv天堂网| 亚洲专区一区二区三区| 午夜一区二区三区在线观看| 国产精品欧美在线| 亚洲欧美视频在线| 久久久女女女女999久久| 激情文学一区| 欧美一区二区三区电影在线观看| 久久婷婷亚洲| 久久在线免费视频| 影音先锋在线一区| 麻豆久久婷婷| 亚洲狼人综合| 亚洲欧美日韩中文播放| 国产午夜精品理论片a级探花| 欧美在线播放一区| 欧美大秀在线观看| 在线一区二区三区做爰视频网站| 欧美视频亚洲视频| 性做久久久久久免费观看欧美| 久久综合国产精品| 日韩视频免费大全中文字幕| 国产精品v欧美精品v日韩精品| 午夜精品福利视频| 欧美国产第一页| 宅男噜噜噜66一区二区66| 国产精品私房写真福利视频| 久久精品免费| 亚洲精品一级| 久久免费视频在线观看| 亚洲九九爱视频| 国产欧美一级| 美女黄色成人网| 亚洲一区二区三区成人在线视频精品| 久久久999成人| aa国产精品| 黑人巨大精品欧美一区二区| 欧美精品久久99久久在免费线| 在线亚洲欧美视频| 免费观看在线综合| 午夜精品福利一区二区三区av| 亚洲成色999久久网站| 国产精品v日韩精品v欧美精品网站| 欧美在线播放一区| 宅男精品导航| 亚洲国产精品热久久| 久久精品亚洲国产奇米99| 一本色道88久久加勒比精品| 激情成人中文字幕| 国产精品青草综合久久久久99| 狂野欧美激情性xxxx欧美| 亚洲欧美日韩精品久久亚洲区| 亚洲国产va精品久久久不卡综合| 久久成人精品视频| 亚洲摸下面视频| 亚洲精品免费网站| 影音先锋中文字幕一区二区| 国产精品久久网站| 欧美日韩一区在线观看| 欧美gay视频激情| 久久久久久久波多野高潮日日| 亚洲欧美国产日韩中文字幕| 日韩天堂av| 亚洲日本视频| 亚洲激情视频在线| 欧美激情无毛|