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

為生存而奔跑

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

留言簿(5)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 331734
  • 排名 - 74

最新評論

閱讀排行榜

評論排行榜

 大家在實際工作學習C#的時候,可能會問:為什么我們要為一些已經存在的功能(比如Windows中的一些功能,C++中已經編寫好的一些方法)要重新編寫代碼,C#有沒有方法可以直接都用這些原本已經存在的功能呢?答案是肯定的,大家可以通過C#中的DllImport直接調用這些功能。
    DllImport所在的名字空間 using System.Runtime.InteropServices;
    MSDN中對DllImportAttribute的解釋是這樣的:可將該屬性應用于方法。DllImportAttribute 屬性提供對從非托管 DLL 導出的函數進行調用所必需的信息。作為最低要求,必須提供包含入口點的 DLL 的名稱
    DllImport 屬性定義如下: 
    namespace System.Runtime.InteropServices 
   { 
    [AttributeUsage(AttributeTargets.Method)] 
    public class DllImportAttribute: System.Attribute 
    { 
     public DllImportAttribute(string dllName) {...} 
     public CallingConvention CallingConvention; 
     public CharSet CharSet; 
     public string EntryPoint; 
     public bool ExactSpelling; 
     public bool PreserveSig; 
     public bool SetLastError; 
     public string Value { get {...} } 
    } 
  }    
    說明:    
    1、DllImport只能放置在方法聲明上。   
    2、DllImport具有單個定位參數:指定包含被導入方法的 dll 名稱的 dllName 參數。   
    3、DllImport具有五個命名參數:    
     a、CallingConvention 參數指示入口點的調用約定。如果未指定 CallingConvention,則使用默認值 CallingConvention.Winapi。    
     b、CharSet 參數指示用在入口點中的字符集。如果未指定 CharSet,則使用默認值 CharSet.Auto。   
     c、EntryPoint 參數給出 dll 中入口點的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。    
     d、ExactSpelling 參數指示 EntryPoint 是否必須與指示的入口點的拼寫完全匹配。如果未指定 ExactSpelling,則使用默認值 false。    
     e、PreserveSig 參數指示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為一個具有 HRESULT 返回值和該返回值的一個名為 retval 的附加輸出參數的簽名。如果未指定 PreserveSig,則使用默認值 true。    
     f、SetLastError 參數指示方法是否保留 Win32"上一錯誤"。如果未指定 SetLastError,則使用默認值 false。    
    4、它是一次性屬性類。    
    5、此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符。

    DllImport的用法:
       DllImport("MyDllImport.dll")]
       private static extern int mySum(int a,int b);

一 在C#程序設計中使用Win32類庫
 常用對應類型:
1、DWORD 是 4 字節的整數,因此我們可以使用 int 或 uint 作為 C# 對應類型。
2、bool 類型與 BOOL 對應。

示例一:調用 Beep() API 來發出聲音
    Beep() 是在 kernel32.lib 中定義的,在MSDN 中的定義,Beep具有以下原型:
    BOOL Beep(DWORD dwFreq, // 聲音頻率 
                           DWORD dwDuration // 聲音持續時間); 
用 C# 編寫以下原型:
[DllImport("kernel32.dll")] 
public static extern bool Beep(int frequency, int duration);

示例二:枚舉類型和常量
    MessageBeep() 是在 user32.lib 中定義的,在MSDN 中的定義,MessageBeep具有以下原型:
    BOOL MessageBeep(UINT uType // 聲音類型
                                           ); 

用C#編寫一下原型:
public enum BeepType
{
  SimpleBeep = -1,
  IconAsterisk = 0x00000040,
  IconExclamation = 0x00000030,
  IconHand = 0x00000010,
  IconQuestion = 0x00000020,
  Ok = 0x00000000,

uType 參數實際上接受一組預先定義的常量,對于 uType 參數,使用 enum 類型是合乎情理的。
[DllImport("user32.dll")]
public static extern bool MessageBeep(BeepType beepType);  

示例三:處理結構
    有時我需要確定我筆記本的電池狀況。Win32 為此提供了電源管理函數,搜索 MSDN 可以找到GetSystemPowerStatus() 函數。 
    BOOL GetSystemPowerStatus( 
                                                          LPSYSTEM_POWER_STATUS lpSystemPowerStatus 
                                                            );
    此函數包含指向某個結構的指針,我們尚未對此進行過處理。要處理結構,我們需要用 C# 定義結構。我們從非托管的定義開始: 
typedef struct _SYSTEM_POWER_STATUS { 
BYTE  ACLineStatus; 
BYTE  BatteryFlag; 
BYTE  BatteryLifePercent; 
BYTE  Reserved1; 
DWORD BatteryLifeTime; 
DWORD BatteryFullLifeTime; 
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS; 
   然后,通過用 C# 類型代替 C 類型來得到 C# 版本。 
struct SystemPowerStatus 

  byte ACLineStatus; 
  byte batteryFlag; 
  byte batteryLifePercent; 
  byte reserved1; 
  int batteryLifeTime; 
  int batteryFullLifeTime; 

    這樣,就可以方便地編寫出 C# 原型: 
    [DllImport("kernel32.dll")] 
    public static extern bool GetSystemPowerStatus( 
  ref SystemPowerStatus systemPowerStatus); 
   在此原型中,我們用“ref”指明將傳遞結構指針而不是結構值。這是處理通過指針傳遞的結構的一般方法。 
   此函數運行良好,但是最好將 ACLineStatus 和 batteryFlag 字段定義為 enum: 
  enum ACLineStatus: byte 
   { 
    Offline = 0, 
    Online = 1, 
    Unknown = 255, 
   } 
   enum BatteryFlag: byte 
   { 
    High = 1, 
    Low = 2, 
    Critical = 4, 
    Charging = 8, 
    NoSystemBattery = 128, 
    Unknown = 255, 
   } 
請注意,由于結構的字段是一些字節,因此我們使用 byte 作為該 enum 的基本類型

示例四:處理字符串


二 C# 中調用C++代碼
    int 類型 
[DllImport(“MyDLL.dll")] 
//返回個int 類型 
public static extern int mySum (int a1,int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int a2,int b2) 

//a2 b2不能改變a1 b1
//a2=..
//b2=...
 return a+b; 

//參數傳遞int 類型 
public static extern int mySum (ref int a1,ref int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int *a2,int *b2) 

//可以改變 a1, b1
*a2=...
*b2=...
 return a+b; 



DLL 需傳入char *類型 
[DllImport(“MyDLL.dll")] 
//傳入值 
public static extern int mySum (string  astr1,string bstr1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr2,char * bstr2) 

//改變astr2 bstr 2  ,astr1 bstr1不會被改變
 return a+b; 
}


DLL 需傳出char *類型 
[DllImport(“MyDLL.dll")] 
// 傳出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf ); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr,char * bstr) 

//傳出char * 改變astr bstr -->abuf, bbuf可以被改變
 return a+b; 

 
DLL 回調函數 

BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) 



using System; 
using System.Runtime.InteropServices; 
public delegate bool CallBack(int hwnd, int lParam); //定義委托函數類型 
public class EnumReportApp 

[DllImport("user32")] 
public static extern int EnumWindows(CallBack x, int y); 
public static void Main() { 
CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0); 

public static bool Report(int hwnd, int lParam) 

Console.Write("Window handle is "); 
Console.WriteLine(hwnd); return true; 


 

DLL  傳遞結構  
BOOL PtInRect(const RECT *lprc, POINT pt); 

using System.Runtime.InteropServices; 
[StructLayout(LayoutKind.Sequential)] 
public struct Point {
 public int x; 
public int y;
 } 
[StructLayout(LayoutKind.Explicit)] 
 public struct Rect 
 { 
[FieldOffset(0)] public int left; 
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right; 
[FieldOffset(12)] public int bottom;
 } 
Class XXXX { 
 [DllImport("User32.dll")] 
public static extern bool PtInRect(ref  Rect r, Point p); 
 }

posted on 2009-12-20 14:28 baby-fly 閱讀(336) 評論(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>
            久久久久久尹人网香蕉| 亚洲国产日韩欧美一区二区三区| 欧美亚洲视频一区二区| 欧美激情bt| 欧美国产乱视频| 一区二区av| 亚洲深夜av| 国产欧美日韩亚洲一区二区三区| 亚洲一区二区免费看| 欧美日本精品在线| 一区二区三区精品| 亚洲欧美视频一区| 一本一本久久a久久精品综合麻豆| 欧美美女视频| 欧美亚洲免费高清在线观看| 午夜免费久久久久| 亚洲国产三级| 一区二区电影免费观看| 国产精品视频精品视频| 欧美一区二区三区成人| 久久精品亚洲乱码伦伦中文| 夜夜爽www精品| 久久久久久91香蕉国产| 一区二区欧美激情| 午夜欧美不卡精品aaaaa| 亚洲国产女人aaa毛片在线| 一区二区精品在线观看| 黑人一区二区三区四区五区| 亚洲国产欧美精品| 国产欧美日韩精品在线| 亚洲久久成人| 亚洲大片免费看| 欧美一级午夜免费电影| 亚洲一区免费网站| 一本一本久久| 麻豆久久婷婷| 亚洲大片在线| 日韩视频中午一区| 欧美国产视频在线| 亚洲国产一区二区精品专区| 樱桃成人精品视频在线播放| 欧美中在线观看| 久久久99国产精品免费| 国产麻豆精品theporn| 亚洲欧美日韩一区二区三区在线观看| 亚洲视频在线观看| 欧美日韩一区在线观看| 一区二区欧美在线观看| 欧美电影美腿模特1979在线看| 欧美成人免费小视频| 最新国产乱人伦偷精品免费网站| 美女视频黄a大片欧美| 日韩视频在线观看一区二区| 亚洲女性裸体视频| 禁久久精品乱码| 欧美日在线观看| 欧美专区日韩视频| 亚洲人成在线影院| 欧美一区国产在线| 亚洲国产导航| 国产精品久久久久9999高清| 久久爱www.| 日韩一级黄色大片| 久久久久久9| 欧美在线影院| 9色精品在线| 亚洲国产欧美久久| 久久女同互慰一区二区三区| 国产精品99久久久久久白浆小说| 国产综合av| 国产乱码精品1区2区3区| 欧美日韩第一区日日骚| 久久久久久久一区二区| 性做久久久久久| 亚洲在线成人| 99成人在线| 亚洲精品一区二区三区蜜桃久| 免费亚洲视频| 免费永久网站黄欧美| 久久国产精品72免费观看| 新狼窝色av性久久久久久| 亚洲乱码一区二区| 亚洲精品美女免费| 亚洲精品久久久一区二区三区| 依依成人综合视频| 亚洲国产专区| 中文在线不卡| 国产精品自拍三区| 国产精品私拍pans大尺度在线| 国产精品国产三级国产专播品爱网| 国产精品九九| 国产欧美一区二区三区国产幕精品| 亚洲一区影院| 久久精品日产第一区二区| 麻豆乱码国产一区二区三区| 欧美黄色影院| 亚洲欧美福利一区二区| 久久国内精品视频| 欧美日韩第一页| 国产亚洲激情视频在线| 91久久精品日日躁夜夜躁欧美| 中文国产亚洲喷潮| 看片网站欧美日韩| 在线一区观看| 久久亚洲欧美| 国内成+人亚洲+欧美+综合在线| 亚洲国产天堂久久综合| 亚洲欧美日韩一区二区| 欧美高清一区| 久久精品99国产精品日本| 欧美日韩在线免费| 在线观看亚洲视频| 欧美一级理论性理论a| 亚洲精品久久久久久久久久久久久| 亚洲香蕉视频| 欧美日本三区| 亚洲精选成人| 亚洲高清123| 久久综合中文色婷婷| 国产欧美日韩激情| 亚洲午夜精品久久| 亚洲欧洲日产国产综合网| 久久精品一区二区三区四区 | 午夜精品亚洲| 国产精品视频xxxx| 亚洲欧美久久久| 一本色道久久综合亚洲精品不卡| 欧美午夜电影一区| 久热精品视频在线| 性欧美xxxx视频在线观看| 欧美一区二区在线播放| 欧美成人免费全部观看天天性色| 一本色道久久综合亚洲精品小说 | 在线视频日韩精品| 亚洲视频一区二区在线观看 | 久久亚洲不卡| 亚洲精品孕妇| 国产区亚洲区欧美区| 欧美成人一区二区三区片免费| 在线视频欧美日韩精品| 久久影音先锋| 亚洲男人的天堂在线观看| 在线 亚洲欧美在线综合一区| 欧美日韩国产成人精品| 久久国产成人| 在线亚洲精品福利网址导航| 久久精品91久久久久久再现| 亚洲精品一区二区三区不| 国产欧美精品一区aⅴ影院| 欧美第十八页| 欧美在线亚洲| 亚洲欧美第一页| 日韩写真视频在线观看| 亚洲美洲欧洲综合国产一区| 国产精品午夜电影| 欧美激情亚洲另类| 亚洲欧美日韩精品久久| 亚洲美女网站| 亚洲欧美日韩一区在线观看| 亚洲毛片在线观看.| 在线电影一区| 国产精品自拍在线| 国产精品初高中精品久久| 久久久夜精品| 欧美中文字幕视频| 久久男人资源视频| 久久成人免费| 欧美亚洲色图校园春色| 亚洲手机视频| 亚洲天堂成人| 亚洲日韩欧美一区二区在线| 亚洲国产成人91精品| 国内精品久久久久久影视8| 欧美日韩精品欧美日韩精品一 | 日韩一级黄色av| 日韩视频三区| 国产伊人精品| 韩国免费一区| 国产欧美日韩| 国产一区二区三区成人欧美日韩在线观看 | 欧美理论电影网| 亚洲精品久久久蜜桃| 亚洲视频一二| 夜夜嗨av色一区二区不卡| 一区二区免费在线观看| 国产精品视频| 亚洲大黄网站| 黄色综合网站| 国产精品嫩草影院av蜜臀| 欧美aⅴ一区二区三区视频| 欧美在线视频免费观看| 亚洲欧美国产日韩天堂区| 美国成人直播| 久久久噜噜噜久久人人看| 久久精品国亚洲| 久久精品视频免费观看| 欧美在线播放高清精品| 裸体歌舞表演一区二区| 久久黄金**| 久久免费偷拍视频|