dotNET C# Programmer's Guide to the Win32 API (Win
2024-07-21 02:20:10
供稿:網友
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 kernel32 {