C#ä¸è°ç¨Windows APIçè¦ç¹
åç±»ï¼ VC++ C# è°ç¨ vc dll åwindows API .NET
2009-02-04 13:37 é 读(1574) è¯è®º(2) æ¶è 举æ¥
ä»ç»
ããAPI(Application Programming Interface)ï¼ææ³å¤§å®¶ä¸ä¼éçï¼å®æ¯æ们Windowsç¼ç¨ç常客ï¼è½ç¶åºäº.Netå¹³å°çC#æäºå¼ºå¤§çç±»åºï¼ä½æ¯ï¼æ们è¿æ¯ä¸è½å¦è®¤APIå¨Windowsç¼ç¨ä¸çéè¦æ§ã大å¤æ°çç¼ç¨è¯è¨é½æ¯æAPIç¼ç¨ï¼è.Netå¹³å°ä¸çMFCï¼Microsoft Foundation Class Libraryï¼ææ¶æ¬èº«å°±å°è£ äºå¤§é¨åçAPIã
ããå为ç¨åºåï¼æ们éè¦äºè§£APIä»åé¢ä¸äºè§£ä¾¿æ¯ç¼ç¨æ¥å£ï¼å æ¤ï¼å为å¼åè ï¼éè¦äºè§£çåªæ¯APIç使ç¨æ¹æ³ã
ããAPIæ ¹æ®æä½ç³»ç»ãå¤çå¨ååè½æ§çä¸åèæ¥æå¾å¤ä¸åçç±»åã ããæä½ç³»ç»ç¹ç¨çAPI:
ããæ¯ç§æä½ç³»ç»é½æ许å¤éç¨çAPI以åä¸äºç¹ç¨çAPIï¼è¿äºç¹ç¨çAPIåªè½å¨å½åæä½ç³»ç»ä¸æ§è¡ã
ããä¾å¦ï¼
ããWindows NT æ¯æ MS-DOS, Win16, Win32, POSIX (Portable Operating System Interface), OS/2 console API; è Windows 95 æ¯æ MS-DOS, Win16 以å Win32 APIs.
ããWin16 & Win32 API:
ããWin16æ¯ä¸ºåå ä½å¤çå¨å¼åçï¼æ©æçæä½ç³»ç»åæ¯æã
ããWin32åæ¯ä¸º32ä½å¤çå¨å¼åãå®å¯ç§»æ¤æ§å¼ºï¼è¢«å¤§é¨åçå¤çå¨ææ¯æã
ããWin32 APIå¨åºååæä¸ä¸ªâ32âåç¼ãæ¯å¦KERNEL32ï¼USER32çã
ããææAPIå¨ä¸é¢3个åºä¸å¾ä»¥è¿è¡ï¼
ããKernel
ããUser
ããGDI
ãã1. KERNEL
ããä»çåºå为 KERNEL32.DLL, ä»ä¸»è¦ç¨äºäº§çä¸æä½ç³»ç»ä¹é´çå ³èï¼
ããç¨åºå è½½
ããä¸ä¸æéæ©.
ããæ件è¾å ¥è¾åº.
ããå å管ç.
ããä¾å¦ï¼ GlobalMemoryStatus å½æ°å°±å æ¬å½åç©çå ååèæå åç使ç¨ä¿¡æ¯ã
ãã2. USER
ããè¿ä¸ªç±»åºå¨Win32ä¸åå« USER32.DLLã
ããå®å 许管çå ¨é¨çç¨æ·æ¥å£ï¼æ¯å¦ï¼
ããçªå£
ããèå
ãã对è¯æ¡
ããå¾æ ç.,
ããä¾å¦ï¼ DrawIcon å½æ°å°å¨æå®ç设å¤å ³èä¸âç»âåºå¾æ æè é¼ æ ã
ãã3. GDI (Graphical Device Interface)
ããå®å¨Win32ä¸çåºå为ï¼GDI32.dllï¼å®æ¯å¾å½¢è¾åºåºã使ç¨GDI Windowsâç»âåºçªå£ãèå以å对è¯æ¡çï¼
ããå®è½å建å¾å½¢è¾åº.
ããå®ä¹è½ä¿åå¾å½¢æ件.
ããä¾å¦ï¼ CreateBitmap å½æ°å°±è½éè¿æå®çé¿ã宽ãé¢è²å建ä¸ä¸ªä½å¾ã
ããC# ä¸æä½API:
ããä½ä¸ºåå¦è æ¥è¯´ï¼å¨C#ä¸ä½¿ç¨APIç¡®æ¯ä¸ä»¶ä»¤äººå¤´ç¼çé®é¢ãå¨ä½¿ç¨APIä¹é´ä½ å¿ é¡»ç¥éå¦ä½å¨C#ä¸ä½¿ç¨ç»æãç±»å转æ¢ãå®å ¨/ä¸å®å ¨ä»£ç ï¼å¯æ§/ä¸å¯æ§ä»£ç ç许å¤ç¥è¯ã
ããä¸åä»ç®åå¼å§ï¼å¤æç大家ä¸æ¶ä¸è½æ¥åãæ们就ä»å®ç°ä¸ä¸ªç®åçMessageBoxå¼å§ãé¦å æå¼VS.Net ï¼å建ä¸ä¸ªæ°çC#å·¥ç¨ï¼å¹¶æ·»å ä¸ä¸ªButtonæé®ãå½è¿ä¸ªæé®è¢«ç¹å»ï¼åæ¾ç¤ºä¸ä¸ªMessageBox对è¯æ¡ã
ããå³ç¶æ们éè¦å¼ç¨å¤æ¥åºï¼æä»¥å¿ é¡»å¯¼å ¥ä¸ä¸ªNamespaceï¼
ããusing System.Runtime.InteropServices;
ããæ¥çæ·»å ä¸é¢ç代ç æ¥å£°æä¸ä¸ªAPIï¼
ãã[DllImport("User32.dll")]
ããpublic static extern int MessageBox(int h, string m, string c, int type);
ããæ¤å¤DllImportå±æ§è¢«ç¨æ¥ä»ä¸å¯æ§ä»£ç ä¸è°ç¨ä¸æ¹æ³ãâUser32.dllâå设å®äºç±»åºåãDllImportå±æ§æå®dllçä½ç½®ï¼è¿ä¸ªdllä¸å æ¬è°ç¨çå¤é¨æ¹æ³ãStatic修饰符å声æä¸ä¸ªéæå ç´ ï¼èè¿ä¸ªå ç´ å±äºç±»åæ¬èº«èä¸æ¯ä¸é¢æå®ç对象ãexternå表示è¿ä¸ªæ¹æ³å°å¨å·¥ç¨å¤é¨æ§è¡ï¼ä½¿ç¨DllImportå¯¼å ¥çæ¹æ³å¿ 须使ç¨extern修饰符ã
ããMessageBox åæ¯å½æ°åï¼æ¥æ4个åæ°ï¼å ¶è¿åå¼ä¸ºæ°åã
ãã大å¤æ°çAPIé½è½ä¼ é并è¿åå¼ã
ããæ·»ä¸Clickç¹å»äºä»¶ä»£ç :
ããprotected void button1_Click(object sender, System.EventArgs e)
ãã{
ããããããMessageBox (0,"API Message Box","API Demo",0);
ãã}
ããç¼è¯å¹¶è¿è¡è¿ä¸ªç¨åºï¼å½ä½ ç¹å»æé®åï¼ä½ å°ä¼çå°å¯¹è¯æ¡ï¼è¿ä¾¿æ¯ä½ 使ç¨çAPIå½æ°ã
ãã使ç¨ç»æä½
ããæä½å¸¦æç»æä½çAPIæ¯ä½¿ç¨ç®åçAPIè¦å¤æçå¤ãä½æ¯ä¸æ¦ä½ ææ¡äºAPIçè¿ç¨ï¼é£ä¸ªæ´ä¸ªAPIä¸çå°å¨ä½ çææ¡ä¹ä¸ã
ããä¸é¢çä¾åä¸æ们å°ä½¿ç¨GetSystemInfo API æ¥è·åæ´ä¸ªç³»ç»çä¿¡æ¯ã
ãã第ä¸æ¥è¿æ¯æå¼C#建ç«ä¸ä¸ªFormå·¥ç¨ï¼åæ ·çæ·»ä¸ä¸ä¸ªButtonæé®ï¼å¨ä»£ç çªä¸è¾å ¥ä¸é¢ç代ç ï¼å¯¼å ¥Namespaceï¼
ããusing System.Runtime.InteropServices;
ãã声æä¸ä¸ªç»æä½ï¼å®å°å为GetSystemInfoçä¸ä¸ªåæ°ï¼
ãã[StructLayout(LayoutKind.Sequential)]
ããpublic struct SYSTEM_INFO {
ããããããpublic uint dwOemId;
ããããããpublic uint dwPageSize;
ããããããpublic uint lpMinimumApplicationAddress;
ããããããpublic uint lpMaximumApplicationAddress;
ããããããpublic uint dwActiveProcessorMask;
ããããããpublic uint dwNumberOfProcessors;
ããããããpublic uint dwProcessorType;
ããããããpublic uint dwAllocationGranularity;
ããããããpublic uint dwProcessorLevel;
ããããããpublic uint dwProcessorRevision;
ãã}
ãã声æAPIå½æ°:
ãã[DllImport("kernel32")]
ããstatic extern void GetSystemInfo(ref SYSTEM_INFO pSI);
ããæ·»å ä¸é¢ç代ç è³æé®çç¹å»äºä»¶å¤çä¸ï¼
ããé¦å å建ä¸ä¸ªSYSTEM_INFOç»æä½ï¼å¹¶å°å ¶ä¼ éç»GetSystemInfoå½æ°ã
ããprotected void button1_Click (object sender, System.EventArgs e)
ãã{
ããããããtry
ãããããã{
ããããããããããSYSTEM_INFO pSI = new SYSTEM_INFO();
ããããããããããGetSystemInfo(ref pSI);
ãããããããããã//
ãããããããããã//
ãããããããããã//
ããä¸æ¦ä½ æ¥æ¶å°è¿åçç»æä½ï¼é£ä¹å°±å¯ä»¥ä»¥è¿åçåæ°æ¥æ§è¡æä½äºã
ããe.g.listBox1.InsertItem (0,pSI.dwActiveProcessorMask.ToString());:
ãããããããããã//
ãããããããããã//
ãããããããããã//
ããããã}
ãããããcatch(Exception er)
ããããã{
ããããããããããMessageBox.Show (er.Message);
ããããã}
ãã}
view plain
è°ç¨APIå ¨é¨ä»£ç
ãã//Created By Ajit Mungale
ãã//ç¨åºè¡¥å é£å
ããnamespace UsingAPI
ãã{
ããusing System;
ããusing System.Drawing;
ããusing System.Collections;
ããusing System.ComponentModel;
ããusing System.WinForms;
ããusing System.Data;
ããusing System.Runtime.InteropServices;
ãã//Struct æ¶éç³»ç»ä¿¡æ¯
ãã[StructLayout(LayoutKind.Sequential)]
ããpublic struct SYSTEM_INFO {
ããããããããpublic uint dwOemId;
ããããããããpublic uint dwPageSize;
ããããããããpublic uint lpMinimumApplicationAddress;
ããããããããpublic uint lpMaximumApplicationAddress;
ããããããããpublic uint dwActiveProcessorMask;
ããããããããpublic uint dwNumberOfProcessors;
ããããããããpublic uint dwProcessorType;
ããããããããpublic uint dwAllocationGranularity;
ããããããããpublic uint dwProcessorLevel;
ããããããããpublic uint dwProcessorRevision;
ãããã}
ãã//struct æ¶éå åæ åµ
ãã[StructLayout(LayoutKind.Sequential)]
ããpublic struct MEMORYSTATUS
ãã{
ãããããããpublic uint dwLength;
ãããããããpublic uint dwMemoryLoad;
ãããããããpublic uint dwTotalPhys;
ãããããããpublic uint dwAvailPhys;
ãããããããpublic uint dwTotalPageFile;
ãããããããpublic uint dwAvailPageFile;
ãããããããpublic uint dwTotalVirtual;
ãããããããpublic uint dwAvailVirtual;
ãã}
ããpublic class Form1 : System.WinForms.Form
ãã{
ããããprivate System.ComponentModel.Container components;
ããããprivate System.WinForms.MenuItem menuAbout;
ããããprivate System.WinForms.MainMenu mainMenu1;
ããããprivate System.WinForms.ListBox listBox1;
ããããprivate System.WinForms.Button button1;
ãã//è·åç³»ç»ä¿¡æ¯
ãããã[DllImport("kernel32")]
ããããstatic extern void GetSystemInfo(ref SYSTEM_INFO pSI);
ãããã//è·åå åä¿¡æ¯
ãããã[DllImport("kernel32")]
ããããstatic extern void GlobalMemoryStatus(ref MEMORYSTATUS buf);
ãããã//å¤çå¨ç±»å
ããããpublic const int PROCESSOR_INTEL_386 = 386;
ããããpublic const int PROCESSOR_INTEL_486 = 486;
ããããpublic const int PROCESSOR_INTEL_PENTIUM = 586;
ããããpublic const int PROCESSOR_MIPS_R4000 = 4000;
ããããpublic const int PROCESSOR_ALPHA_21064 = 21064;
ããããpublic Form1()
ãããã{
ããããããInitializeComponent();
ãããã}
ããããpublic override void Dispose()
ãããã{
ããããããbase.Dispose();
ããããããcomponents.Dispose();
ãããã}
ããããprivate void InitializeComponent()
ããããã{
ãããããããthis.components = new System.ComponentModel.Container ();
ãããããããthis.mainMenu1 = new System.WinForms.MainMenu ();
ãããããããthis.button1 = new System.WinForms.Button ();
ãããããããthis.listBox1 = new System.WinForms.ListBox ();
ãããããããthis.menuAbout = new System.WinForms.MenuItem ();
ãããããããmainMenu1.MenuItems.All = new System.WinForms.MenuItem[1] {this.menuAbout};
ãããããããbutton1.Location = new System.Drawing.Point (148, 168);
ãããããããbutton1.Size = new System.Drawing.Size (112, 32);
ãããããããbutton1.TabIndex = 0;
ãããããããbutton1.Text = "&Get Info";
ãããããããbutton1.Click += new System.EventHandler (this.button1_Click);
ãããããããlistBox1.Location = new System.Drawing.Point (20, 8);
ãããããããlistBox1.Size = new System.Drawing.Size (368, 147);
ãããããããlistBox1.TabIndex = 1;
ãããããããmenuAbout.Text = "&About";
ãããããããmenuAbout.Index = 0;
ãããããããmenuAbout.Click += new System.EventHandler (this.menuAbout_Click);
ãããããããthis.Text = "System Information - Using API";
ãããããããthis.MaximizeBox = false;
ãããããããthis.AutoScaleBaseSize = new System.Drawing.Size (5, 13);
ãããããããthis.MinimizeBox = false;
ãããããããthis.Menu = this.mainMenu1;
ãããããããthis.ClientSize = new System.Drawing.Size (408, 213);
ãããããããthis.Controls.Add (this.listBox1);
ãããããããthis.Controls.Add (this.button1);
ãããã}
ããããprotected void menuAbout_Click (object sender, System.EventArgs e)
ãããã{
ãããããããForm abt=new about() ;
ãããããããabt.ShowDialog();
ãããã}
ããããprotected void button1_Click (object sender, System.EventArgs e)
ãããã{
ãããããããtry
ããããããã{
ããããããããããSYSTEM_INFO pSI = new SYSTEM_INFO();
ããããããããããGetSystemInfo(ref pSI);
ããããããããããstring CPUType;
ããããããããããswitch (pSI.dwProcessorType)
ãããããããããã{
ããããããããããããcase PROCESSOR_INTEL_386 :
ãããããããããããããããCPUType= "Intel 386";
ãããããããããããããããbreak;
ããããããããããããcase PROCESSOR_INTEL_486 :
ãããããããããããããããCPUType = "Intel 486" ;
ããããããããããããããbreak;
ããããããããããããcase PROCESSOR_INTEL_PENTIUM :
ããããããããããããããCPUType = "Intel Pentium";
ããããããããããããããbreak;
ããããããããããããcase PROCESSOR_MIPS_R4000 :
ããããããããããããããCPUType = "MIPS R4000";
ããããããããããããããbreak;
ããããããããããããcase PROCESSOR_ALPHA_21064 :
ããããããããããããããCPUType = "DEC Alpha 21064";
ããããããããããããããbreak;
ããããããããããããdefault :
ããããããããããããããCPUType = "(unknown)";
ããããããããã}
ãããããããããlistBox1.InsertItem (0,"Active Processor Mask :"+pSI.dwActiveProcessorMask.ToString());
ãããããããããlistBox1.InsertItem (1,"Allocation Granularity :"+pSI.dwAllocationGranularity.ToString());
ãããããããããlistBox1.InsertItem (2,"Number Of Processors :"+pSI.dwNumberOfProcessors.ToString());
ãããããããããlistBox1.InsertItem (3,"OEM ID :"+pSI.dwOemId.ToString());
ãããããããããlistBox1.InsertItem (4,"Page Size:"+pSI.dwPageSize.ToString());
ãããããããããlistBox1.InsertItem (5,"Processor Level Value:"+pSI.dwProcessorLevel.ToString());
ãããããããããlistBox1.InsertItem (6,"Processor Revision:"+ pSI.dwProcessorRevision.ToString());
ãããããããããlistBox1.InsertItem (7,"CPU type:"+CPUType);
ãããããããããlistBox1.InsertItem (8,"Maximum Application Address: "+pSI.lpMaximumApplicationAddress.ToString());
ãããããããããlistBox1.InsertItem (9,"Minimum Application Address:" +pSI.lpMinimumApplicationAddress.ToString());
ããããããããã
ãããããããããMEMORYSTATUS memSt = new MEMORYSTATUS ();
ãããããããããGlobalMemoryStatus (ref memSt);
ãããããããããlistBox1.InsertItem(10,"Available Page File :"+ (memSt.dwAvailPageFile/1024).ToString ());
ãããããããããlistBox1.InsertItem(11,"Available Physical Memory : " + (memSt.dwAvailPhys/1024).ToString());
ãããããããããlistBox1.InsertItem(12,"Available Virtual Memory:" + (memSt.dwAvailVirtual/1024).ToString ());
ãããããããããlistBox1.InsertItem(13,"Size of structur :" + memSt.dwLength.ToString());
ãããããããããlistBox1.InsertItem(14,"Memory In Use :"+ memSt.dwMemoryLoad.ToString());
ãããããããããlistBox1.InsertItem(15,"Total Page Size :"+ (memSt.dwTotalPageFile/1024).ToString ());
ãããããããããlistBox1.InsertItem(16,"Total Physical Memory :" + (memSt.dwTotalPhys/1024).ToString());
ãããããããããlistBox1.InsertItem(17,"Total Virtual Memory :" + (memSt.dwTotalVirtual/1024).ToString ());
ããããããã}
ãããããããcatch(Exception er)
ããããããã{
ãããããããããMessageBox.Show (er.Message);
ããããããã}
ãããã}
ããããpublic static void Main(string[] args)
ãããã{
ããããããtry
ããããããã{
ããããããããããApplication.Run(new Form1());
ããããããã}
ãããããããcatch(Exception er)
ããããããã{
ããããããããããMessageBox.Show (er.Message );
ããããããã}
ããã}
ãã}
}
C#ä¸è°ç¨Windows APIçè¦ç¹
æ¥æï¼2003å¹´12æ11æ¥ ä½è ï¼ä½å 人æ°ï¼586 æ¥ç:[大åä½ ä¸åä½ å°åä½]
å¨.Net Framework SDKææ¡£ä¸ï¼å ³äºè°ç¨Windows APIçæ示æ¯è¾é¶æ£ï¼å¹¶ä¸å ¶ä¸ç¨å ¨é¢ä¸ç¹çæ¯é对Visual Basic .net讲述çãæ¬æå°C#ä¸è°ç¨APIçè¦ç¹æ±éå¦ä¸ï¼å¸æç»æªå¨C#ä¸ä½¿ç¨è¿APIçæåä¸ç¹å¸®å©ãå¦å¤å¦æå®è£ äºVisual Studio .netçè¯ï¼å¨C:/Program Files/Microsoft Visual Studio .NET/FrameworkSDK/Samples/Technologies/Interop/PlatformInvoke/WinAPIs/CSç®å½ä¸æ大éçè°ç¨APIçä¾åã
ä¸ãè°ç¨æ ¼å¼
using System.Runtime.InteropServices; //å¼ç¨æ¤å称空é´ï¼ç®ååé¢ç代ç
...
//使ç¨DllImportAttributeç¹æ§æ¥å¼å ¥apiå½æ°ï¼æ³¨æ声æçæ¯ç©ºæ¹æ³ï¼å³æ¹æ³ä½ä¸ºç©ºã
[DllImport("user32.dll")]
public static extern ReturnType FunctionName(type arg1,type arg2,...);
//è°ç¨æ¶ä¸è°ç¨å ¶ä»æ¹æ³å¹¶æ åºå«
å¯ä»¥ä½¿ç¨å段è¿ä¸æ¥è¯´æç¹æ§ï¼ç¨éå·éå¼ï¼å¦ï¼
[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]
DllImportAttributeç¹æ§çå ¬å ±å段å¦ä¸ï¼
1ãCallingConvention æ示åéæ管å®ç°ä¼ éæ¹æ³åæ°æ¶æç¨ç CallingConvention å¼ã
CallingConvention.Cdecl : è°ç¨æ¹æ¸ çå æ ãå®ä½¿æ¨è½å¤è°ç¨å ·æ varargs çå½æ°ã
CallingConvention.StdCall : 被è°ç¨æ¹æ¸ çå æ ãå®æ¯ä»æ管代ç è°ç¨éæ管å½æ°çé»è®¤çº¦å®ã
2ãCharSet æ§å¶è°ç¨å½æ°çå称çæ¬åæ示å¦ä½åæ¹æ³å°é String åæ°ã
æ¤å段被设置为 CharSet å¼ä¹ä¸ãå¦æ CharSet å段设置为 Unicodeï¼åææå符串åæ°å¨ä¼ éå°éæ管å®ç°ä¹åé½è½¬æ¢æ Unicode å符ãè¿è¿å¯¼è´å DLL EntryPoint çå称ä¸è¿½å åæ¯âWâãå¦ææ¤å段设置为 Ansiï¼åå符串å°è½¬æ¢æ ANSI å符串ï¼åæ¶å DLL EntryPoint çå称ä¸è¿½å åæ¯âAâã大å¤æ° Win32 API 使ç¨è¿ç§è¿½å âWâæâAâç约å®ãå¦æ CharSet 设置为 Autoï¼åè¿ç§è½¬æ¢å°±æ¯ä¸å¹³å°æå ³çï¼å¨ Windows NT ä¸ä¸º Unicodeï¼å¨ Windows 98 ä¸ä¸º Ansiï¼ãCharSet çé»è®¤å¼ä¸º AnsiãCharSet å段ä¹ç¨äºç¡®å®å°ä»æå®ç DLL å¯¼å ¥åªä¸ªçæ¬çå½æ°ãCharSet.Ansi å CharSet.Unicode çå称å¹é è§å大ä¸ç¸åãå¯¹äº Ansi æ¥è¯´ï¼å¦æå° EntryPoint 设置为âMyMethodâä¸å®åå¨çè¯ï¼åè¿åâMyMethodâãå¦æ DLL ä¸æ²¡æâMyMethodâï¼ä½åå¨âMyMethodAâï¼åè¿åâMyMethodAâãå¯¹äº Unicode æ¥è¯´åæ£å¥½ç¸åãå¦æå° EntryPoint 设置为âMyMethodâä¸å®åå¨çè¯ï¼åè¿åâMyMethodWâãå¦æ DLL ä¸ä¸åå¨âMyMethodWâï¼ä½åå¨âMyMethodâï¼åè¿åâMyMethodâãå¦æ使ç¨çæ¯ Autoï¼åå¹é è§åä¸å¹³å°æå ³ï¼å¨ Windows NT ä¸ä¸º Unicodeï¼å¨ Windows 98 ä¸ä¸º Ansiï¼ãå¦æ ExactSpelling 设置为 trueï¼ååªæå½ DLL ä¸åå¨âMyMethodâæ¶æè¿åâMyMethodâã
3ãEntryPoint æ示è¦è°ç¨ç DLL å ¥å£ç¹çå称æåºå·ã
å¦æä½ çæ¹æ³åä¸æ³ä¸apiå½æ°ååçè¯ï¼ä¸å®è¦æå®æ¤åæ°,ä¾å¦ï¼
[DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]
public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);
4ãExactSpelling æ示æ¯å¦åºä¿®æ¹éæ管 DLL ä¸çå ¥å£ç¹çå称ï¼ä»¥ä¸ CharSet å段ä¸æå®ç CharSet å¼ç¸å¯¹åºãå¦æ为 trueï¼åå½ DllImportAttribute.CharSet å段设置为 CharSet ç Ansi å¼æ¶ï¼åæ¹æ³å称ä¸è¿½å åæ¯ Aï¼å½ DllImportAttribute.CharSet å段设置为 CharSet ç Unicode å¼æ¶ï¼åæ¹æ³çå称ä¸è¿½å åæ¯ Wãæ¤å段çé»è®¤å¼æ¯ falseã
5ãPreserveSig æ示æ管æ¹æ³ç¾åä¸åºè½¬æ¢æè¿å HRESULTã并ä¸å¯è½æä¸ä¸ªå¯¹åºäºè¿åå¼çéå [out, retval] åæ°çéæ管ç¾åã
6ãSetLastError æ示被è°ç¨æ¹å¨ä»å±æ§åæ¹æ³è¿åä¹åå°è°ç¨ Win32 API SetLastErrorã true æ示è°ç¨æ¹å°è°ç¨ SetLastErrorï¼é»è®¤ä¸º falseãè¿è¡æ¶å°éææ¶å¨å°è°ç¨ GetLastError 并ç¼åè¿åçå¼ï¼ä»¥é²å ¶è¢«å ¶ä» API è°ç¨éåãç¨æ·å¯éè¿è°ç¨ GetLastWin32Error æ¥æ£ç´¢é误代ç ã
äºãåæ°ç±»åï¼
1ãæ°å¼åç´æ¥ç¨å¯¹åºçå°±å¯ãï¼DWORD -> int , WORD -> Int16ï¼
2ãAPIä¸å符串æéç±»å -> .netä¸string
3ãAPIä¸å¥æ (dWord) -> .netä¸IntPtr
4ãAPIä¸ç»æ -> .netä¸ç»ææè ç±»ã注æè¿ç§æ åµä¸ï¼è¦å ç¨StructLayoutç¹æ§éå®å£°æç»ææç±»
å ¬å ±è¯è¨è¿è¡åºå©ç¨StructLayoutAttributeæ§å¶ç±»æç»æçæ°æ®å段å¨æ管å åä¸çç©çå¸å±,å³ç±»æç»æéè¦ææç§æ¹å¼æåãå¦æè¦å°ç±»ä¼ éç»éè¦æå®å¸å±çéæ管代ç ï¼åæ¾å¼æ§å¶ç±»å¸å±æ¯éè¦çãå®çæé å½æ°ä¸ç¨LayoutKindå¼åå§å StructLayoutAttribute ç±»çæ°å®ä¾ã LayoutKind.Sequential ç¨äºå¼ºå¶å°æåæå ¶åºç°ç顺åºè¿è¡é¡ºåºå¸å±ã
LayoutKind.Explicit ç¨äºæ§å¶æ¯ä¸ªæ°æ®æåç精确ä½ç½®ãå©ç¨ Explicitï¼ æ¯ä¸ªæåå¿ é¡»ä½¿ç¨ FieldOffsetAttribute æ示æ¤å段å¨ç±»åä¸çä½ç½®ãå¦ï¼
[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
public class MySystemTime
{
[FieldOffset(0)]public ushort wYear;
[FieldOffset(2)]public ushort wMonth;
[FieldOffset(4)]public ushort wDayOfWeek;
[FieldOffset(6)]public ushort wDay;
[FieldOffset(8)]public ushort wHour;
[FieldOffset(10)]public ushort wMinute;
[FieldOffset(12)]public ushort wSecond;
[FieldOffset(14)]public ushort wMilliseconds;
}
ä¸é¢æ¯é对APIä¸OSVERSIONINFOç»æï¼å¨.netä¸å®ä¹å¯¹åºç±»æç»æçä¾åï¼
//.netä¸å£°æ为类
[ StructLayout( LayoutKind.Sequential )]
public class OSVersionInfo
{
public int OSVersionInfoSize;
public int majorVersion;
public int minorVersion;
public int buildNumber;
public int platformId;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public String versionString;
}
//æè
//.netä¸å£°æ为ç»æ
[ StructLayout( LayoutKind.Sequential )]
public struct OSVersionInfo2
{
public int OSVersionInfoSize;
public int majorVersion;
public int minorVersion;
public int buildNumber;
public int platformId;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public String versionString;
}
æ¤ä¾ä¸ç¨å°MashalAsç¹æ§ï¼å®ç¨äºæè¿°å段ãæ¹æ³æåæ°çå°éå¤çæ ¼å¼ãç¨å®ä½ä¸ºåæ°åç¼å¹¶æå®ç®æ éè¦çæ°æ®ç±»åãä¾å¦ï¼ä»¥ä¸ä»£ç å°ä¸¤ä¸ªåæ°ä½ä¸ºæ°æ®ç±»åé¿æéå°éç» Windows API å½æ°çå符串 (LPStr)ï¼
[MarshalAs(UnmanagedType.LPStr)]
String existingfile;
[MarshalAs(UnmanagedType.LPStr)]
String newfile;
注æç»æä½ä¸ºåæ°æ¶åï¼ä¸è¬åé¢è¦å ä¸ref修饰符ï¼å¦åä¼åºç°é误ï¼å¯¹è±¡çå¼ç¨æ²¡ææå®å¯¹è±¡çå®ä¾ã
[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]
public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );
ä¸ãå¦ä½ä¿è¯ä½¿ç¨æ管对象çå¹³å°è°ç¨æåï¼
å¦æå¨è°ç¨å¹³å° invoke åçä»»ä½ä½ç½®é½æªå¼ç¨æ管对象ï¼ååå¾åæ¶å¨å¯è½å°å®æ该æ管对象ãè¿å°éæ¾èµæºå¹¶ä½¿å¥ææ æï¼ä»è导è´å¹³å°invoke è°ç¨å¤±è´¥ãç¨ HandleRef å è£ å¥æå¯ä¿è¯å¨å¹³å° invoke è°ç¨å®æåï¼ä¸å¯¹æ管对象è¿è¡åå¾åæ¶ã
ä¾å¦ä¸é¢ï¼
FileStream fs = new FileStream( "a.txt", FileMode.Open );
StringBuilder buffer = new StringBuilder( 5 );
int read = 0;
ReadFile(fs.Handle, buffer, 5, out read, 0 ); //è°ç¨Win APIä¸çReadFileå½æ°
ç±äºfsæ¯æ管对象ï¼æ以æå¯è½å¨å¹³å°è°ç¨è¿æªå®ææ¶å被åå¾åæ¶ç«åæ¶ãå°æ件æµçå¥æç¨HandleRefå è£ åï¼å°±è½é¿å 被åå¾ç«åæ¶:
[ DllImport( "Kernel32.dll" )]
public static extern bool ReadFile(
HandleRef hndRef,
StringBuilder buffer,
int numberOfBytesToRead,
out int numberOfBytesRead,
ref Overlapped flag );
......
......
FileStream fs = new FileStream( "HandleRef.txt", FileMode.Open );
HandleRef hr = new HandleRef( fs, fs.Handle );
StringBuilder buffer = new StringBuilder( 5 );
int read = 0;
// platform invoke will hold reference to HandleRef until call ends
ReadFile( hr, buffer, 5, out read, 0 );