dotNET C# Programmer’s Guide to the Win32 API (Win32 API 聲明C#版)
小氣的神 2001.09.07
噢,對不起我用了這個標題,事實上如果我能做到10%,我就很高興了。因為我的桌上正放著一本Dan Appleman的書,它曾伴隨我許多年,也許你也有一本:1215頁,藍色書皮,機械工業出版社。英文名叫:《 Dan Appleman’s Visual Basic 5.0 Programmer’s Guide to the Win32 API 》。而我除了借用這個類似的名字之外,只是做了一下整理工作,不過這是一個不小的工作量(haha)
我把KERNEL32.DLL、USER32.DLL、GDI32.DLL、 ADVAPI32.DLL、SHELL32.DLL、SPOOLSS.DLL、WINMM.DLL的函數和聲明整理了一下,改用C#的語法重新改寫了一遍,整理出一個C#版本。這樣針對dotNET的Platform Invocation Services(PInVoke),你就可以直接使用這些Win32的API函數了。目前MS沒有公布整個的Win32API有多少可以在dotNET中使用,有多少不行。有些功能在dotNET中沒有對應的實現,那麼目前你可能還需要使用Win32的API函數。
結構和枚舉聲明放在一起,Kernel32.dll、User32.Dll、GDI32.dll分別放在3個cs文件中;剩下的Advapi32.dll、Shell32.dll、Spoolss.dll、Winmm.dll四個DLL的函數放在一個cs文件中,整個的namespace 起名叫Win32API.大致的構架應該象下面這樣:
namespace Win32API {
using System;
using System.Runtime.InteropServices;
先是所有的結構和枚舉聲明
class Kernel32 {….}
class User32 {….}
class GDI32 {….}
class Advapi32 {….}
class Shell32 {….}
class Spoolss {….}
class Winmm {….}
}
對應的生成下面的C#文件:
Structs.Net.cs
Kernel32.Net.cs
User32.Net.cs
GDI32.Net.cs
OtherFnc.Net.cs
然後編譯它們,這樣就可以使用它們了,我沒有計算5個文件包括的所有的准確個數,不過應該有百個結構和枚舉,上千個函數聲明吧。完成這些之後,現在最常用的MessageBox我可以這樣使用了:
using System ;
using Win32API;
public class TestWin32API
{
public static void Main()
{
int iRet ;
iRet = User32.MessageBox( 0, "Hello C# Win32 API" , "My Pinvoke", 0 ) ;
}
}
就在測試這個例子時發生了一件有趣的事,因為剛開始我的cs文件都沒有加NET的標識這樣很自然的就有了Kernel32.cs、 User32.cs等等,MessageBox是User32.DLL中的,而我編譯的User32.cs默認生成的也叫User32.DLL,當我執行這個測試程序時終於發生錯誤,我一直以為自己的聲明有問題,然後我用FrameworkSDK中的例子也還是出錯,直到我在其它的目錄中運行正常時,我才發現原來自己的DLL名和系統的DLL名完全一樣。然後就改成上面的那樣,不過很奇怪csc /t:exe /r:User32.dll TestWin32API.cs 的編譯指令居然沒有錯誤提示,真是可惡。提醒你不要也象我一樣。
惡夢也許還在後面,我還不知道真正的cs聲明中又有多少個錯誤,反正用到的時候再調試吧。