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

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  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| 蜜臀av性久久久久蜜臀aⅴ| 看欧美日韩国产| 欧美~级网站不卡| 欧美日韩一区二区免费在线观看| 欧美精品在线免费观看| 欧美亚洲成人免费| 国产日本亚洲高清| 亚洲大胆在线| 亚洲视频免费在线| 久久久青草青青国产亚洲免观| 亚洲成色精品| 亚洲激情小视频| 在线综合视频| 久久久在线视频| 欧美日韩国产综合视频在线观看| 国产精品福利av| 尤物精品在线| 亚洲一区三区电影在线观看| 亚洲欧洲在线看| 欧美一级午夜免费电影| 久久福利资源站| 欧美国产日韩一二三区| 国产精品蜜臀在线观看| 亚洲欧洲精品一区二区精品久久久| 亚洲午夜小视频| 欧美成人一区二免费视频软件| 宅男精品视频| 欧美肥婆bbw| 国产一区二区毛片| 一区二区三区四区蜜桃| 美女主播精品视频一二三四| 亚洲手机成人高清视频| 欧美金8天国| 亚洲国产精品99久久久久久久久| 午夜精品一区二区三区在线| 亚洲国产合集| 久久天天躁夜夜躁狠狠躁2022| 国产精品久久久久影院亚瑟| 亚洲国产精品综合| 久久亚洲不卡| 欧美专区在线观看一区| 国产精品va在线播放我和闺蜜| 亚洲精品女人| 欧美成人久久| 麻豆精品视频在线观看| 精品动漫3d一区二区三区免费版 | 国语自产在线不卡| 香蕉成人久久| 亚洲视屏在线播放| 国产精品久久9| 亚洲无线一线二线三线区别av| 亚洲黄色精品| 欧美精品日韩综合在线| 91久久综合亚洲鲁鲁五月天| 免费久久99精品国产| 久久久久久久网站| 有码中文亚洲精品| 欧美成人综合| 欧美激情一区二区三区在线视频 | 亚洲精品一区二区三区蜜桃久| 久久精品在线观看| 欧美一级免费视频| 激情91久久| 欧美成年视频| 欧美精品二区三区四区免费看视频| 亚洲精品日本| 999亚洲国产精| 国产精品久久久久久久久免费樱桃| 一区二区欧美视频| 亚洲欧美久久久| 国内精品免费在线观看| 欧美寡妇偷汉性猛交| 欧美肥婆bbw| 亚洲一区二区在线免费观看视频| 亚洲一区二区三区色| 99国内精品| 久久精品1区| 亚洲高清久久网| 欧美搞黄网站| 国产精品黄色在线观看| 久久精品电影| 欧美xxx在线观看| 亚洲一区二区三区四区视频| 亚洲欧美国产一区二区三区| 在线国产精品一区| 一本大道久久a久久精品综合| 国产欧美日韩综合一区在线观看| 农夫在线精品视频免费观看| 欧美日韩中文在线观看| 久久色在线观看| 欧美精品一区二区三区视频| 久久精品国产999大香线蕉| 欧美高清视频一区二区三区在线观看| 亚洲伊人一本大道中文字幕| 久久久久久日产精品| 亚洲一区三区电影在线观看| 开心色5月久久精品| 亚洲欧美日本国产有色| 久久精品国产精品亚洲综合| 亚洲视频每日更新| 毛片av中文字幕一区二区| 亚洲欧美成aⅴ人在线观看| 老司机免费视频一区二区| 午夜精品视频一区| 欧美日韩国产色站一区二区三区| 久久噜噜亚洲综合| 国产精品你懂的| 亚洲人成7777| 亚洲国产成人久久综合一区| 欧美亚洲视频在线看网址| 亚洲私人影院| 欧美激情四色 | 亚洲视频每日更新| 久久香蕉精品| 久久性天堂网| 国产午夜久久| 亚洲一区二区久久| 亚洲制服av| 欧美色精品天天在线观看视频| 亚洲国产电影| 亚洲欧洲三级电影| 久久久久91| 久久久久欧美精品| 国产精品伦理| 一区二区久久久久久| 一区二区三区视频在线 | 好吊色欧美一区二区三区视频| 夜夜嗨av一区二区三区中文字幕| 亚洲青涩在线| 欧美成人一二三| 亚洲第一在线综合在线| 亚洲国产综合视频在线观看| 久久免费99精品久久久久久| 久久久久久久国产| 国内精品亚洲| 久久综合九色| 亚洲国产精品www| 亚洲精品日韩在线观看| 亚洲欧美日韩精品久久久久| 亚洲第一精品福利| 亚洲高清在线播放| 麻豆国产精品一区二区三区| 久久久亚洲人| 国语对白精品一区二区| 欧美在线视屏| 欧美韩日一区二区| 亚洲激情女人| 欧美日韩免费在线| 亚洲永久精品国产| 久久久噜久噜久久综合| 亚洲国产高清高潮精品美女| 欧美激情成人在线| 亚洲一区二区黄色| 久久免费视频观看| 亚洲精品久久久久久下一站| 欧美日韩一区三区四区| 亚洲在线一区二区| 久久视频一区二区| 亚洲精品永久免费| 国产精品国产三级国产普通话三级 | 国产日韩精品一区| 久久婷婷av| 日韩亚洲欧美一区二区三区| 亚洲自拍另类| 国产热re99久久6国产精品| 久久亚洲精品一区二区| 亚洲精品久久久久久久久| 亚洲欧美日韩人成在线播放| 好吊妞这里只有精品| 欧美视频不卡中文| 久久视频精品在线| 亚洲无亚洲人成网站77777| 欧美成人精品高清在线播放| 亚洲午夜一区二区| 亚洲国产精品小视频| 国产精品免费网站在线观看| 久久综合九色综合欧美就去吻 | 亚洲一区中文| 亚洲国产精品成人综合色在线婷婷| 欧美日韩一区二区三区在线 | 亚洲欧美一区二区视频| 亚洲国产一区二区三区高清| 国产精品久久久久久一区二区三区 | 亚洲一区二区三区乱码aⅴ蜜桃女| 国产亚洲精品久久久| 欧美日韩国产综合一区二区| 久久久久久久久蜜桃| 宅男噜噜噜66一区二区66| 欧美激情视频一区二区三区不卡| 欧美一区二区三区免费看| 亚洲精品日本| 狠狠色2019综合网| 美女免费视频一区| 国产精品美女视频网站| 欧美三级日本三级少妇99|