日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C#調(diào)用WindowsAPI之參數(shù)類(lèi)型淺析

C#調(diào)用Windows API之參數(shù)類(lèi)型是什么樣子的呢?

C#調(diào)用Windows API之參數(shù)類(lèi)型1、

數(shù)值型直接用對(duì)應(yīng)的就可。

(DWORD -> int , WORD -> Int16)

C#調(diào)用Windows API之參數(shù)類(lèi)型2、

API中字符串指針類(lèi)型 -> .net中string

C#調(diào)用Windows API之參數(shù)類(lèi)型3、

API中句柄 (dWord)  -> .net中IntPtr

C#調(diào)用Windows API之參數(shù)類(lèi)型4、

API中結(jié)構(gòu)   -> .net中結(jié)構(gòu)或者類(lèi)。注意這種情況下,要先用StructLayout特性限定聲明結(jié)構(gòu)或類(lèi)

公共語(yǔ)言運(yùn)行庫(kù)利用StructLayoutAttribute控制類(lèi)或結(jié)構(gòu)的數(shù)據(jù)字段在托管內(nèi)存中的物理布局,即類(lèi)或結(jié)構(gòu)需要按某種方式排列。如果要將類(lèi)傳遞給需要指定布局的非托管代碼,則顯式控制類(lèi)布局是重要的。它的構(gòu)造函數(shù)中用LayoutKind值初始化 StructLayoutAttribute 類(lèi)的新實(shí)例。 LayoutKind.Sequential 用于強(qiáng)制將成員按其出現(xiàn)的順序進(jìn)行順序布局。

LayoutKind.Explicit 用于控制每個(gè)數(shù)據(jù)成員的精確位置。利用 Explicit, 每個(gè)成員必須使用 FieldOffsetAttribute 指示此字段在類(lèi)型中的位置。如:

 
 
 
  1. [StructLayout(LayoutKind.Explicit,   
  2. Size=16, CharSet=CharSet.Ansi)]  
  3. public class MySystemTime   
  4. {  
  5. [FieldOffset(0)]public ushort wYear;   
  6. [FieldOffset(2)]public ushort wMonth;  
  7. [FieldOffset(4)]public ushort wDayOfWeek;   
  8. [FieldOffset(6)]public ushort wDay;   
  9. [FieldOffset(8)]public ushort wHour;   
  10. [FieldOffset(10)]public ushort wMinute;   
  11. [FieldOffset(12)]public ushort wSecond;   
  12. [FieldOffset(14)]public ushort wMilliseconds;   
  13. }  

C#調(diào)用Windows API之參數(shù)類(lèi)型實(shí)例說(shuō)明:

下面是針對(duì)API中OSVERSIONINFO結(jié)構(gòu),在.net中定義對(duì)應(yīng)類(lèi)或結(jié)構(gòu)的例子:

 
 
 
  1. /**********************************************  
  2. * API中定義原結(jié)構(gòu)聲明  
  3. * OSVERSIONINFOA STRUCT  
  4. *  dwOSVersionInfoSize   DWORD      ?  
  5. *  dwMajorVersion        DWORD      ?  
  6. *  dwMinorVersion        DWORD      ?  
  7. *  dwBuildNumber         DWORD      ?  
  8. *  dwPlatformId          DWORD      ?  
  9. *  szCSDVersion          BYTE 128 dup (?)  
  10. * OSVERSIONINFOA ENDS  
  11. *  
  12. * OSVERSIONINFO  equ    
  13. *********************************************/   
  14.  
  15.  
  16.  
  17. //.net中聲明為類(lèi)  
  18. [ StructLayout( LayoutKind.Sequential )]     
  19. public class OSVersionInfo   
  20. {     
  21. public int OSVersionInfoSize;  
  22. public int majorVersion;   
  23. public int minorVersion;  
  24. public int buildNumber;  
  25. public int platformId;  
  26. [ MarshalAs( UnmanagedType.ByValTStr,   
  27. SizeConst=128 )]      
  28. public String versionString;  
  29. }  
  30. //或者  
  31. //.net中聲明為結(jié)構(gòu)  
  32. [ StructLayout( LayoutKind.Sequential )]    
  33. public struct OSVersionInfo2   
  34. {  
  35. public int OSVersionInfoSize;  
  36. public int majorVersion;   
  37. public int minorVersion;  
  38. public int buildNumber;  
  39. public int platformId;  
  40.  
  41. [ MarshalAs( UnmanagedType.ByValTStr,   
  42. SizeConst=128 )]      
  43. public String versionString;  
  44. }  

此例中用到MashalAs特性,它用于描述字段、方法或參數(shù)的封送處理格式。用它作為參數(shù)前綴并指定目標(biāo)需要的數(shù)據(jù)類(lèi)型。例如,以下代碼將兩個(gè)參數(shù)作為數(shù)據(jù)類(lèi)型長(zhǎng)指針?lè)馑徒o Windows API 函數(shù)的字符串 (LPStr):

 
 
 
  1. [MarshalAs(UnmanagedType.LPStr)]  
  2. String existingfile;  
  3. [MarshalAs(UnmanagedType.LPStr)]  
  4. String newfile;  

C#調(diào)用Windows API之參數(shù)類(lèi)型注意事項(xiàng):

注意結(jié)構(gòu)作為參數(shù)時(shí)候,一般前面要加上ref修飾符,否則會(huì)出現(xiàn)錯(cuò)誤:對(duì)象的引用沒(méi)有指定對(duì)象的實(shí)例。

 
 
 
  1. [ DllImport( "kernel32",  
  2.  
  3.  EntryPoint="GetVersionEx" )]   
  4. public static extern bool   
  5.  
  6. GetVersionEx2( ref OSVersionInfo2 osvi );   

C#調(diào)用Windows API之參數(shù)類(lèi)型基本的情況就是這樣子的,希望通過(guò)介紹對(duì)你了解和學(xué)習(xí)C#調(diào)用Windows API之參數(shù)類(lèi)型有所幫助。


文章名稱(chēng):C#調(diào)用WindowsAPI之參數(shù)類(lèi)型淺析
標(biāo)題來(lái)源:http://www.dlmjj.cn/article/cogpidj.html