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

為生存而奔跑

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

留言簿(5)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 331736
  • 排名 - 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>
            亚洲免费观看| 亚洲经典在线看| 亚洲一级在线观看| 欧美三区视频| 亚洲激情午夜| 亚洲午夜激情网站| 亚洲视频高清| 国产一区二区三区高清播放| 亚洲精品女av网站| 快播亚洲色图| 欧美成人蜜桃| 亚洲人成网站在线播| 在线亚洲成人| 国产精品久久国产精品99gif| 亚洲国产精品综合| 玖玖在线精品| 亚洲免费视频在线观看| 亚洲综合导航| 欧美成人免费观看| 快播亚洲色图| 亚洲精品欧美一区二区三区| 欧美精品在线网站| 亚洲摸下面视频| 亚洲欧美日韩国产一区| 亚洲国产婷婷香蕉久久久久久| 一本久久综合亚洲鲁鲁| 免费高清在线一区| 久久先锋影音av| 日韩一级精品视频在线观看| 99re6这里只有精品| 夜夜嗨av一区二区三区网页| 美女诱惑一区| 99re6热在线精品视频播放速度 | 欧美人体xx| 欧美视频中文在线看| 国产视频一区三区| 黑丝一区二区三区| 亚洲欧美激情精品一区二区| 久久久噜噜噜久久中文字幕色伊伊| 亚洲欧美成人一区二区三区| 伊人精品在线| 在线观看三级视频欧美| 最近中文字幕日韩精品 | 久久久久久国产精品一区| 欧美在线免费视频| 亚洲欧美一区二区在线观看| 羞羞色国产精品| 亚洲一区二区三区四区中文| 欧美激情一区二区三区在线视频观看| 国产欧美一区二区精品性色| 亚洲六月丁香色婷婷综合久久| 久久精品国产一区二区三区免费看| 亚洲精品中文在线| 久久影院亚洲| 亚洲国产欧美在线人成| 久久国产精品99国产| 国模私拍视频一区| 午夜久久久久| 一区二区三区四区五区视频| 久热精品视频在线观看| 欧美视频不卡中文| 久久av二区| 亚洲一区二区少妇| 中国av一区| 女人香蕉久久**毛片精品| 99国产成+人+综合+亚洲欧美| 亚洲一区二区免费视频| 国产精品video| 一区二区三区国产在线| 欧美成人精品1314www| 亚洲人成免费| 欧美韩日亚洲| 国产亚洲精品久久久久婷婷瑜伽| 午夜精品一区二区三区四区| 久久久久国产成人精品亚洲午夜| 欧美精品一区二区三| 国产精品女主播一区二区三区| 欧美日韩一区在线观看视频| 国产精品99久久久久久久vr| 午夜精品一区二区三区在线| 欧美激情精品久久久久久黑人| 欧美黄色一区| 欧美性猛片xxxx免费看久爱 | 国产精品久久久久久影视 | 乱中年女人伦av一区二区| 久久国产精品亚洲77777| 欧美日韩视频| 亚洲视频一区二区在线观看| 欧美xx69| 亚洲欧美一级二级三级| 9久草视频在线视频精品| 国产精自产拍久久久久久蜜| 欧美激情一二区| 欧美日韩一区二区在线观看| 亚洲精选久久| 国产精品久久久亚洲一区| 免费观看日韩av| 亚洲精品在线视频| 欧美精品首页| 亚洲福利视频三区| 亚洲毛片av在线| 午夜伦理片一区| 国产亚洲精品aa| 亚洲深夜福利在线| 欧美激情五月| 亚洲少妇在线| 欧美日韩91| 欧美一区二区视频在线观看2020 | 亚洲国内在线| 狠狠入ady亚洲精品| 亚洲国产精品一区二区久| 日韩一级片网址| 欧美+亚洲+精品+三区| 久久久五月天| 午夜日韩电影| 亚洲精品一区中文| 亚洲视频在线播放| 狠狠色丁香婷综合久久| 免费在线亚洲| 一区二区电影免费在线观看| 欧美精品一区二区三区高清aⅴ| 一区二区三欧美| 欧美一区二区播放| 亚洲美女黄色片| 亚洲精选视频免费看| 亚洲一区二区三区高清| 免费欧美日韩国产三级电影| 欧美激情在线观看| 亚洲欧美中日韩| 亚洲性夜色噜噜噜7777| 国产性天天综合网| 一本色道久久综合精品竹菊| 激情欧美一区二区三区| 性色av一区二区三区红粉影视| 韩日欧美一区| 欧美gay视频| 欧美日韩在线一区二区| 亚洲欧美成人一区二区三区| 亚洲欧美卡通另类91av| 一区二区三区国产| 午夜欧美精品| 亚洲综合999| 久久精品一二三| 一区二区不卡在线视频 午夜欧美不卡在| 欧美视频精品在线观看| 免费成人黄色| 久久精品成人一区二区三区蜜臀| 欧美一区二区三区在线免费观看| 日韩视频免费观看| 亚洲第一黄网| 国产精品sss| 国产麻豆综合| 激情欧美日韩| 亚洲激情二区| 欧美中文字幕在线| 久久久999| 一本大道久久精品懂色aⅴ| 中文av一区特黄| 99精品国产在热久久婷婷| 亚洲电影在线| 久久精品国产免费| 国产日韩欧美高清| 欧美国产日韩a欧美在线观看| 一区二区三区成人精品| 欧美日韩在线播放三区| 一级成人国产| 国产精品v欧美精品v日本精品动漫| 欧美成人一区二区三区| 欧美一级专区免费大片| 亚洲日本理论电影| 一本在线高清不卡dvd | 国产精品一区二区三区久久久| 一本色道久久综合亚洲精品不卡| 久久中文精品| 性欧美18~19sex高清播放| 久久久人成影片一区二区三区观看| 欧美国产日韩一区| 亚洲欧美精品伊人久久| 午夜精品在线看| 久久国产精品毛片| 久久精品国产久精国产一老狼| 国产一区白浆| 欧美大片在线看| 夜夜嗨av一区二区三区网页 | 久久中文在线| 在线精品国精品国产尤物884a| 国产乱肥老妇国产一区二| 亚洲国产欧美一区二区三区久久| 亚洲黄网站黄| 亚洲高清123| 亚洲国产精彩中文乱码av在线播放| 一区二区三区四区五区精品| 亚洲国产精品va| 一本色道**综合亚洲精品蜜桃冫| 国产精品视频观看| 午夜免费日韩视频| 在线观看91精品国产麻豆| 亚洲成在线观看| 国产一区二区三区四区三区四 | 亚洲视频一区二区|