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

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  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>
            久久国产日韩| 国内精品久久久久影院 日本资源| 欧美激情一区三区| 免费久久久一本精品久久区| 麻豆视频一区二区| 亚洲电影在线播放| 亚洲黄页一区| 亚洲午夜在线观看视频在线| 亚洲午夜小视频| 久久久久网址| 欧美/亚洲一区| 欧美午夜不卡影院在线观看完整版免费| 欧美调教vk| 在线免费观看视频一区| 中国成人亚色综合网站| 久久国产一区二区| 亚洲福利专区| 午夜一区二区三视频在线观看| 久久久久一本一区二区青青蜜月| 欧美精品成人一区二区在线观看| 国产精品剧情在线亚洲| 一区二区三区亚洲| 亚洲伊人网站| 欧美黄色aa电影| 亚洲一区二区三区四区中文| 猛男gaygay欧美视频| 国产精品国产三级国产aⅴ浪潮| 国内精品久久久久久久果冻传媒| 亚洲美女黄网| 久久天天狠狠| 亚洲四色影视在线观看| 免费一级欧美片在线观看| 亚洲国产高清在线| 在线综合视频| 欧美日本簧片| 亚洲人成网站在线播| 欧美一区二区三区视频免费播放| 亚洲丰满在线| 久久亚洲午夜电影| 国产一区二区三区在线播放免费观看| 亚洲毛片在线| 亚洲国产一区二区三区在线播| 欧美在线播放视频| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美在线视频一区二区三区| 欧美激情精品久久久久| 久久国产精品第一页| 国产精品久久久久久久第一福利| 亚洲欧洲一区| 欧美粗暴jizz性欧美20| 欧美激情一区二区三区 | 久久综合九色欧美综合狠狠| 亚洲欧美日韩国产一区二区| 欧美日韩亚洲免费| 一区二区三区四区精品| 亚洲日韩中文字幕在线播放| 女主播福利一区| 尤物九九久久国产精品的特点| 久久精品国产99| 欧美影片第一页| 樱桃视频在线观看一区| 欧美h视频在线| 欧美二区不卡| 亚洲先锋成人| 亚洲女人小视频在线观看| 国产日韩欧美在线看| 久久久久国产精品一区| 久久人人精品| 亚洲免费电影在线| 亚洲精品一区二区三区99| 欧美日韩p片| 亚洲综合二区| 久久都是精品| 亚洲开发第一视频在线播放| 亚洲国产精品精华液2区45| 欧美精品aa| 亚洲欧美日韩一区二区三区在线| 亚洲综合欧美日韩| 国产亚洲美州欧州综合国| 欧美成人免费va影院高清| 欧美人在线视频| 久久超碰97中文字幕| 久久天天躁狠狠躁夜夜av| 91久久精品日日躁夜夜躁欧美| 最新中文字幕亚洲| 国产精品一级二级三级| 欧美大片在线观看| 国产精品夫妻自拍| 老司机午夜精品视频| 欧美精品一区二区三区蜜桃 | 亚洲欧美国产视频| 性色av香蕉一区二区| 亚洲国产你懂的| 一区二区三区国产精品| 影音先锋亚洲一区| a4yy欧美一区二区三区| 国产精品自拍小视频| 欧美大片在线看免费观看| 欧美日韩亚洲另类| 欧美成人免费va影院高清| 国产精品久久久久久久久久尿| 久久亚洲视频| 欧美涩涩网站| 欧美大胆成人| 国产一区二区三区免费不卡| 亚洲精品乱码久久久久久按摩观| 国产精品成人观看视频免费| 欧美成人蜜桃| 国产亚洲精品aa午夜观看| 亚洲精品一区二区三区在线观看| 国内精品视频在线观看| 亚洲视频福利| 中文av字幕一区| 久久综合狠狠综合久久激情| 亚洲自拍16p| 免费黄网站欧美| 久久久久亚洲综合| 国产精品手机在线| 亚洲精品在线电影| 亚洲精品视频二区| 久久婷婷久久| 久久久综合精品| 国产亚洲欧美日韩日本| 亚洲图片在线观看| 亚洲一区二区在线视频| 免费久久99精品国产自| 蜜桃久久av一区| 影音先锋日韩精品| 久久在线免费观看视频| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品美女久久久| 一本久久知道综合久久| 亚洲午夜激情网站| 欧美无乱码久久久免费午夜一区| 亚洲第一在线视频| 亚洲国内精品在线| 欧美成人精品在线播放| 欧美福利视频| 亚洲免费观看| 欧美日本久久| 一区二区三区精品国产| 午夜精品福利一区二区蜜股av| 欧美日韩你懂的| 一区二区三区日韩精品| 午夜精品福利电影| 国产在线欧美| 久久久久91| 亚洲国产精品久久久久秋霞影院| 91久久综合亚洲鲁鲁五月天| 欧美99在线视频观看| 亚洲毛片在线观看| 欧美一级在线播放| 雨宫琴音一区二区在线| 欧美韩日一区| 亚洲一区二区免费看| 激情久久久久| 久久久亚洲高清| 亚洲精品日韩在线| 亚洲欧美影音先锋| 一区免费观看视频| 欧美日韩国产黄| 亚洲一区二区三区精品动漫| 久久尤物视频| 亚洲视频一区二区免费在线观看| 国产精品黄色| 久久久噜久噜久久综合| 91久久国产精品91久久性色| 亚洲尤物在线| 亚洲电影免费在线| 国产精品igao视频网网址不卡日韩| 亚洲一区二区欧美日韩| 免费欧美日韩| 亚洲午夜视频在线观看| 国产揄拍国内精品对白| 欧美区一区二| 久久免费黄色| 一区二区三区精品视频在线观看| 久久久久九九视频| 制服丝袜激情欧洲亚洲| 在线观看精品一区| 国产精品视频免费一区| 免费不卡视频| 亚洲男女自偷自拍图片另类| 亚洲成色精品| 久久久久成人精品| 亚洲欧美日韩一区在线| 日韩午夜在线播放| 激情91久久| 国产日韩欧美在线观看| 欧美日韩无遮挡| 美女黄色成人网| 久久久久成人精品免费播放动漫| 日韩视频在线一区二区| 女人天堂亚洲aⅴ在线观看| 香蕉久久精品日日躁夜夜躁| av成人动漫| 99re亚洲国产精品| 亚洲精品在线免费| 亚洲国产一区二区三区a毛片| 国内精品免费午夜毛片|