首页 > 编程 > .NET > 正文

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 {
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表