dotNET C# Programmer’s Guide to the Win32 API (Win

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

时间: 2024-10-28 15:17:44

dotNET C# Programmer’s Guide to the Win32 API (Win的相关文章

如何在C#中使用Win32 API和其他库

C# 用户经常提出两个问题:"我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?"当框架小组构建他们的 .NET 部分时,他们评估了为使 .NET 程序员可以使用 Win32 而需要完成的工作,结果发现 Win32 API 集非常庞大.他们没有足够的资源为所有 Win32 API 编写托管接口.加以测试并编写文档,因此只能优先处理最重要的部分.许多常用操作都有托管接口,但是还有许多完整的 Win32 部分没有托管接口. 平台

用Win32 API实现串行通信

串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.我们可以利用Windows API 提供的通信函数编写出高可移植性的串行通信程序. 在Win16中,可以利用OpenComm.CloseComm和WriteComm等函数打开.关闭和读写串口.但在Win32中,串口和其他通信设备均被作为文件处理,串口的打开.关闭和读写等操作所用的API函数与操作文件的函数相同.可通过CreateFile函数打开串口,通过CloseFile函数关闭串口,通过CommProp.D

深入浅出VC++串口编程之基于Win32 API

1.API描述 在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与 文件操作的API一致. 打开串口 Win32 中用于打开串口的API 函数为 CreateFile,其原型为: HANDLE CreateFile ( LPCTSTR lpFileName, //将要打开的串口逻辑名,如COM1 或COM2 DWORD dwAccess, //指定串口访问的类型 ,可以是读取.写入或两者并列 DWORD dwShareMode, //指定共享属性,由于串口不 能共享,该参数

Win32 API实现的组件对象集

本组件实现了七个COM对象: 一.COM组件,实现了两个 Dispatch 接口 Itest(默认接口): 实现了BASE64加解密,发送邮件,以给定分隔字符把字符串转换成数组,钩子安装,设置IIS默认站点的主目录,拷贝文件夹,删除文件夹,创建多级目录,以给定日期计算星期几,得到内存大小,创建快捷方式,注册COM组件,检测WINDOWS版本,得到磁盘剩余空间,得到程序组路径 IOpen: 调用"打开文件"通用对话框,并对其定制,实现了文本文件的预览.调用"浏览"通用

系统理解Win32 API和MFC(下)

二.MFC的概念模型 前面我们研究了WIN32 API的"领域模型",对它有较全面的认识.下面,对MFC概念模型的研究,我们把重点放在对app framework的研究上. app framework中的message响应/传递机制是最重要的.而Hook机制和Message响应/传递机制是密切相关的,后者以前者为基础. 1. Hook机制 也许有些程序员只知道hook机制可以编写很"牛"的应用,孰不知MFC本身也是依靠hook机制的. 从图中看到,每个hook拥有一

系统理解Win32 API和MFC(上)

Win32 API是微软的操作系统Windows提供给开发人员的编程接口,它决定了我们开发的Windows应用程序的能力.MFC是微软为开发人员提供的类库,在某种意义上是对Win32 API的封装.本文试图从全局角度对Win32 API和MFC进行理解──给出二者的概念模型. 本文使用UML描述概念模型.Win32 API本不是面向对象的,我用面向对象的观点去理解它,无非是想表达其全局. 本文参考了MSDN.相关书籍和网上的一些资料,在此一并感谢. 一.Win32 API的概念模型 Win32

介绍一个Win32 API串口控制MFC打包类

支持环境:Windows 9x.Windows ME.Windows NT.Windows2000 简介:这是一个Win32 API的打包类,对处理串口的Win32 API类进行了封装,借助这个类可以很方便地对串口进行操作. 特性: C++接口简洁易用 使用C++异常时,首选 Win32 常规的返回值机制.保证使用CSerialPort的代码更加健壮. 支持UNICODE,支持MFC静态链接并且所有代码都在 warning level 4 级别上进行洁净编译. 支持串口模块使用重叠.阻塞和回调(

c#调用Win32 Api函数

在c#中可以通过互操作性服务using System.Runtime.InteropServices来调用window api函数.并且通过属性来指定api函数的位置,以及调用方式,比如,我们要调用User32.dll里的函数MessageBox(HWnd hwnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT type) 首先引入名字空间 using System.Runtime.InteropServices; 其次定义一个静态方法,并且指定调用的方式.其中用关

.NET Compact Framework下Win32 API P/Invoke的使用

由于CF是一个精简(Compact)的.NET Framework,因此在开发CF应用时有一部分功能MS并没有在CF中实现,需要直接调用Win32的API来实现.由于Win32的API是面向native代码的,一般会提供一个DLL库以及相应header文件.使用C++是十分容易和简单调用这些API,但是使用C# .NET就没那么幸运了.C#调用Win32的API往往要借助于P/Invoke的帮助,下面讲述一下P/Invoke 的使用. API的引入 调用Win32的API需要引入相应的DLL,W