C# 和 Win32API

API (Application Programming Interface) is a set of commands, which interfaces the programs with the processors. The most commonly used set of external procedures are those that make up Microsoft Windows itself. The Windows API contains thousands of functions, structures, and constants that you can declare and use in your projects. Those functions are written in the C language, however, so they must be declared before you can use them. The declarations for DLL procedures can become fairly complex. Specifically to C# it is more complex than VB. You can use API viewer tool to get API function declaration but you have to keep in mind the type of parameter which is different in C#.

API(应用编程接口)是程序与处理器接口的命令集。最常用的就是在外部调用微软WINDOWS内部的进程。WINDOWS API包括成千的你可以使用的函数、结构、常量。这些函数是用C语言写的,在使用他们之前,你必须声明。 定义Dll的进程将相当的复杂,甚至比VB还复杂。你可以使用API Viewer工具得到API函数的声明,但是必须注意的是,它的参数类型跟C#的不一样。

Most of the advanced languages support API programming. The Microsoft Foundation Class Library (MFC) framework encapsulates a large portion of the Win32 (API). ODBC API Functions are useful for performing fast operations on database. With API your application can request lower-level services to perform on computer's operating system. As API supports thousands of functionality from simple Message Box to Encryption or Remote computing, developers should know how to implement API in their program.

大部分的高级语言都支持API,微软函数类库(MFC)封装了大部分的Win32 API。ODBC API对提高数据库的操作速度大有好处。使用API,可以请求更底层的系统服务。API从简单的对话框到复杂的加密运算都提供支持。开发者应该知道如何在他们程序中使用API

API has many types depending on OS, processor and functionality.

API有许多类型,(针对不同的操作系统、处理器…………)

OS specific API:
操作系统特有API:

Each operating system has common set of API's and some special e.g. Windows NT supports MS-DOS, Win16, Win32, POSIX (Portable Operating System Interface), OS/2 console API and Windows 95 supports MS-DOS, Win16 and Win32 APIs,

每种操作系统都有一套公用API和专有API。比如:Windows NT 支持MS-DOS, Win16, Win32, POSIX (便携式操作系统接口),OS/2 console API ;同时Windows 95 supports MS-DOS, Win16 和Win32 API。

Win16 和 Win32 API:
Win16 is an API created for 16-bit processor and relies on 16 bit values. It has platform independent nature e.g. you can tie Win16 programs to MS-DOS feature like TSR programs.

WIN16 是基于16位的处理器,并使用16位的值,它是一个独立的平台。比如:你可以运行TSR 程序在MS-DOS环境下。

Win32 is an API created for 32-bit processor and relies on 32 bit values. It is portable to any operating system, wide range of processors and platform independent nature.

WIN32 是基于32位的处理器,并使用32位的值。他可用于任何操作系统,它的使用范围更广。

Win32 API has 32 prefix after the library name e.g. KERNEL32, USER32 etc?

Win32 API的DLL一般都具有32的后缀,比如:KERNEL32, USER32等。

All APIs are implemented using 3 Libraries.

所有的API都在下面3个DLL中实现的。

Kernel
User
GDI

1. KERNEL
It is the library named KERNEL32.DLL, which supports capabilities that are associated with OS such as

它的库名是:KERNEL32.DLL,它是操作系统管理的API集

Process loading. 加载进程
Context switching.
File I/O. 文件操作
Memory management. 内存管理
e.g. The GlobalMemoryStatus function obtains information about the system's current usage of both physical and virtual memory

比如:GlobalMemoryStatus 函数获得目前系统物理虚拟内存的使用信息。

2. USER
This is the library named "USER32.DLL" in Win32.

在WIN32下,它的库名是 USER32.DLL

This allows managing the entire user interfaces such as

它管理全部的用户界面,比如:

Windows 窗口
Menus 菜单
Dialog Boxes 对话框
Icons etc., 图标等
e.g. The DrawIcon function draws an icon or cursor into the specified device context.

比如:DrawIcon 画一个图标在指定的设备上。

3. GDI (Graphical Device Interface)
This is the library named "GDI32.dll" in Win32. It is Graphic output library. Using GDI Windows draws windows, menus and dialog boxes.

这个DLL是GDI32.dll,它负责图像的输出,使用GDI绘出窗口,菜单,对话框

It can create Graphical Output. 输出图像
It can also use for storing graphical images. 存储图像
e.g. The CreateBitmap function creates a bitmap with the specified width, height, and color format (color planes and bits-per-pixel).

比如:CreateBitmap 函数创建一个指定宽度、高度和颜色格式的位图。

C# and API:
Implementing API in C# is tuff job for beginners. Before implementing API you should know how to implement structure in C#, type conversion, safe/unsafe code, managed/unmanaged code and lots more.

C#中API的工具对初学者是相当不错的。在C#使用中使用API之前,你应该先知道C#中如何使用结构、类型转换,安全与不安全代码等。

Before implementing complex API we will start with simple MessageBox API. To implement code for MessageBox API open new C# project and add one button. When button gets clicked the code will display Message Box.

使用复杂的api之前,我们先用一个简单的MessageBox API作为列子。打开一个C#工程,增加一个按钮,在按钮的点击事件中,我们将显示一个信息框。

增加使用外部库的命名空间:

using System.Runtime.InteropServices;
下面声明API

[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);

Where DllImport attribute used for calling method from unmanaged code. "User32.dll" indicates library name. DllImport attribute specifies the dll location that contains the implementation of an extern method. The static modifier used to declare a static member, which belongs to the type itself rather than to a specific object, extern is used to indicate that the method is implemented externally. A method that is decorated with the DllImport attribute must have the extern modifier.

DllImport属性用来指定包含外部方法的动态连接库的位置。 "User32.dll"指出了库名,static 指明它不属于特定的对象。extern 指明是一个外部的方法。带有DllImport 属性的方法必须带有修饰符extern 。

MessageBox is function name, which returns int and takes 4 parameters as shown in declaration.

MessageBox 是一个汉数名,带四个参数返回一个int型值。

Many API uses structure to pass and retrieve values, as it is less expensive. It also uses constant data type for passing constant data and simple data type for passing Built-in data type as seen in previous declaration of MessageBox function.

许多API使用结构来传递、返回参数,这样可以减少复杂度。它也允许使用象MessageBox 函数那样,使用固定的参数。

在按钮的点击事件中增加下面代码:

protected void button1_Click (object sender, System.EventArgs e)
{

MessageBox (0,"API Message Box","API Demo",0);

}

编译并运行程序,点击按钮以后,你就可以看到一个由API调用的信息框。

Using structure 使用结构
Working with API, which uses complex structure or structure in structure, is somewhat complex than using simple API. But once you understand the implementation then whole API world is yours.

API中经常使用复杂的结构。不过一旦你明白了他们,将是很简单的。

In next example we will use GetSystemInfo API which returns information about the current system.

下面的列子,我们用GetSystemInfo API得到当前系统的信息。

第一步:增加一个C#窗口,并在上面增加一个按钮,在窗口代码页增加一个命名空间:

using System.Runtime.InteropServices;

声明 GetSystemInfo 的参数结构:

[StructLayout(LayoutKind.Sequential)]

public struct SYSTEM_INFO {

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

声明API函数:

[DllImport("kernel32")]

static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

Where ref is method parameter keyword causes a method to refer to the same variable that was passed into the method.

ref是一个标志参量传递形式的关键字,它使传入传出的变量指向同一个变量(传址传递)

Add following code in button click event in which first create struct object and then pass it to function.

在按钮点击事件中增加下面的代码,

protected void button1_Click (object sender, System.EventArgs e)
{

try
{

SYSTEM_INFO pSI = new SYSTEM_INFO();
GetSystemInfo(ref pSI);
//
//
//

Once you retrieve the structure perform operations on required parameter

比如:

listBox1.Items.Insert(0,pSI.dwActiveProcessorMask.ToString());

//
//
//


}


catch(Exception er)
{


MessageBox.Show (er.Message);

}


}

你可能感兴趣的:(C++,c,windows,dos,C#)