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 {