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聲明中又有多少個錯誤,反正用到的時候再調試吧。因為太多了所以不可能全都測試,也不敢一個個的測試,只希望自己這些整理能起到拋磚引玉的作用,如果以后你有新的版本,不要忘了Mail一份給我。
附帶的Zip包中有所有cs的源碼,我在Framework SDK Beta2 下都編譯通過。
Windows 2000 ADV Server SP2 EN
Visual C# Compiler Version 7.00.9254
CLR version v1.0.2914
你可以根據你的情況進行編譯(要先編譯Structs.NET.cs,因為其它的都要/r:Structs.NET.DLL)或者使用二進制的DLL。dotnet的編譯技術很好,5個DLL加起來才100多K。
下面是一下源碼的節選:
--------------------------------------------------------------------------------
// Write by ccBoy
// Date: 2001.09.07
// csc /t:library /r:System.dll Structs.NET.cs
// csc /t:library /r:Structs.NET.dll Kernel32.NET.cs
// Emeditor 3.14
namespace Win32API {
using System;
using System.Runtime.InteropServices;
[StructLayout (LayoutKind.Sequential)]
public class ABC {
public int abcA;
public int abcB;
public int abcC;
}
[StructLayout (LayoutKind.Sequential)]
public class ABCFLOAT {
public float abcfA;
public float abcfB;
public float abcfC;
}
public Class Kerne
|