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

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  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>
            老司机精品视频一区二区三区| 葵司免费一区二区三区四区五区| 国产精品久久中文| 麻豆乱码国产一区二区三区| 麻豆国产va免费精品高清在线| 久久夜色精品国产亚洲aⅴ| 久久久综合激的五月天| 久久久之久亚州精品露出| 免费成人在线视频网站| 欧美日韩国产一区二区三区地区 | 久久久99精品免费观看不卡| 欧美福利一区二区三区| 亚洲精品国偷自产在线99热| 亚洲国产日韩欧美在线图片| 一本色道久久88综合日韩精品| 一区二区三区精品国产| 欧美在线电影| 欧美精品三级在线观看| 国产免费一区二区三区香蕉精| 一区精品在线| 亚洲免费中文| 欧美高清视频一区二区| 亚洲一区二区在线看| 久久亚洲欧美国产精品乐播| 欧美日韩在线一区二区| 亚洲国产成人在线| 午夜久久福利| 亚洲精品免费在线播放| 久久精品99国产精品| 欧美日韩综合网| 亚洲国产精品成人精品| 性欧美办公室18xxxxhd| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲永久在线| 欧美乱大交xxxxx| 精品成人久久| 欧美在线视频网站| 日韩一区二区精品在线观看| 亚洲国产日韩精品| 久久躁日日躁aaaaxxxx| 亚洲精品视频在线播放| 亚洲影院色在线观看免费| 噜噜噜噜噜久久久久久91 | 久久精品亚洲| 久久偷窥视频| 欧美极品在线播放| 男同欧美伦乱| 暖暖成人免费视频| 亚洲欧美日本另类| 欧美三级网页| 亚洲乱码日产精品bd| 久久精品一二三区| 亚洲综合色激情五月| 欧美日韩高清在线播放| 亚洲欧洲日产国产网站| 欧美成人免费网站| 久久久综合网站| 激情久久久久久久| 久久综合中文字幕| 久久午夜羞羞影院免费观看| 在线电影国产精品| 牛牛精品成人免费视频| 久久综合九色99| 亚洲激情亚洲| 最新精品在线| 欧美全黄视频| 亚洲欧美国产va在线影院| 亚洲视频免费在线| 国产精品一区二区你懂的| 午夜精品国产更新| 午夜久久电影网| 狠狠干成人综合网| 蜜桃久久av| 欧美成人影音| 亚洲一二三级电影| 亚洲欧美欧美一区二区三区| 国产一区日韩二区欧美三区| 免费久久99精品国产自| 欧美日本在线播放| 欧美一级大片在线观看| 久久av一区二区三区漫画| 一区二区三区在线视频观看| 欧美国产视频日韩| 欧美特黄a级高清免费大片a级| 欧美呦呦网站| 蜜月aⅴ免费一区二区三区 | 国产视频在线观看一区二区| 午夜精品一区二区三区在线视| 一区二区三区日韩| 国产欧美精品日韩区二区麻豆天美| 久久久国产午夜精品| 久久一二三国产| 中文日韩电影网站| 欧美在线不卡| 一区二区国产在线观看| 欧美自拍偷拍午夜视频| 亚洲免费观看高清在线观看| 亚洲欧美在线网| 亚洲精品一二三| 香蕉视频成人在线观看| 亚洲欧洲精品一区二区精品久久久| 一区二区动漫| 亚洲国产精品成人| 午夜综合激情| 亚洲一级电影| 欧美国产专区| 模特精品裸拍一区| 国产日韩精品在线| 亚洲精品小视频| 亚洲欧洲精品一区二区三区| 久久av资源网站| 午夜在线精品| 欧美色偷偷大香| 亚洲精选在线| 日韩视频永久免费| 久久久久久婷| 久久夜色精品国产噜噜av| 国产精品区一区二区三| 亚洲毛片一区二区| 99精品免费视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲国产成人av| 黄色精品网站| 午夜日韩电影| 午夜在线一区| 国产精品青草综合久久久久99| 99精品国产热久久91蜜凸| 亚洲精品美女免费| 免费一级欧美片在线观看| 久久久精品网| 国语自产在线不卡| 久久精品国产一区二区电影| 久久久久久久久久码影片| 国产中文一区| 久久国产精品高清| 久久香蕉国产线看观看av| 国产一区二区三区免费不卡| 欧美一区二区三区的| 久久久久久精| 娇妻被交换粗又大又硬视频欧美| 久久成人资源| 免费在线播放第一区高清av| 欲色影视综合吧| 久久综合一区| 亚洲国产欧美在线| 亚洲小少妇裸体bbw| 精品9999| 久久成人18免费观看| 久久久综合网站| 在线看视频不卡| 欧美国产日韩二区| 一区二区高清在线观看| 午夜精品久久久久久久| 国产日韩视频| 久久一综合视频| 亚洲精品视频一区| 亚欧成人精品| 尤妮丝一区二区裸体视频| 麻豆freexxxx性91精品| 最新国产成人在线观看| 亚洲欧美日产图| 狠狠色狠狠色综合人人| 欧美高清在线观看| 亚洲午夜国产一区99re久久| 久久精品国产v日韩v亚洲| 一区在线视频| 欧美视频在线观看免费| 欧美一级午夜免费电影| 亚洲国产影院| 久久精品水蜜桃av综合天堂| 亚洲精品影视| 精品999网站| 国产精品卡一卡二| 蜜臀av性久久久久蜜臀aⅴ四虎 | 母乳一区在线观看| 亚洲综合电影| 亚洲高清一二三区| 国产精品久久久99| 免费国产自线拍一欧美视频| 亚洲欧美国产日韩天堂区| 欧美高清视频在线| 欧美一级欧美一级在线播放| 亚洲精品国产精品久久清纯直播| 国产精品中文在线| 欧美精品在线观看播放| 久久久久久久激情视频| 亚洲视频视频在线| 亚洲国产综合在线| 六月丁香综合| 久久国产精品一区二区三区| 一本一道久久综合狠狠老精东影业 | 国产婷婷一区二区| 欧美喷水视频| 欧美刺激性大交免费视频| 久久国内精品自在自线400部| 一本色道久久综合亚洲精品婷婷| 欧美大学生性色视频| 噜噜噜91成人网| 久久久久综合一区二区三区| 亚洲男同1069视频|