澳门金莎娱乐手机版 操作系统 设计这个概念已经被融入到C++之中,2.1       Windows数据类型.. 1

设计这个概念已经被融入到C++之中,2.1       Windows数据类型.. 1



  刚开首上学Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,首倘诺将MessageBox这几个Windows
API函数的。

C语言是面向进度的,而C++是面向对象的

目录

  Message博克斯函数是累累人刚伊始学习Windows程序设计还是是Windows
API遭受的第八个放置函数,那么些函数使用的诀倘使:

C和C++的区别:

2.1       Windows数据类型.. 1

  MessageBox(NULL, TEXT(“弹出框内容”),
TEXT(“标题”), MB_OK);

C是一个结构化语言,它的首要在于算法和数据结构。C程序的陈设性重视思量的是如何通过三个历程,对输入进行演算管理拿到输出调节卡塔尔国。

2.1.1       Windows数据类型示例.. 1

  初次之外,它还应该有多少个姐妹:

C++,主要盘算的是何许组织一个对象模型,让那几个模型能够相符与之对应的难题域,那样就足以透过拿到对象的情景音讯得到输出或促成进程序调控制。
所以C与C++的最大分化在于它们的用于解决难点的合计艺术不肖似。之所以说C++比C更上进,是因为“
设计那些定义已经被融合到C++之中 ”。

2.1.2       Windows 数据类型与标准C 数据类型的关系.. 5

  MessageBoxA(NULL, “弹出框内容”,
“标题”, MB_OK);   // TEXT无关大局

C与C++的最大差距:在于它们的用来缓和难题的考虑方法不平等。之所以说C++比C更先进,是因为“
设计这一个概念已经被融合到C++之中
”,而就语言本人来说,在C中越来越多的是算法的概念。那么是否C就不重大了,错!算法是先后设计的底子,好的规划若无好的算法,同样极度。况兼,“C加上好的设计”也能写出相当好的事物。

2.1.3       Windows 数据类型与Windows API 5

  MessageBoxW(NULL, L””, L””, MB_OK);  
                    // 这几个L用来表示Unicode,无法归纳

图片 1

2.1.4       Windows 中的数据结构.. 6

  其实之所以有那四个是因为微软特殊供给满足Windows
98之后对汉字等其余语言编码的急需,这种需求通过Unicode达成,可是微软本意不是要大家选择Unicode来编制程序,而是经过行使“通用”格局,也正是MessageBox();函数,实现分裂的编码主要依旧经过IDE集成开荒情况下退换不一样的编码情势。回到MessageBox();,昨天可比高烧的是,怎么在MessageBox();中贯彻变量的打字与印刷呢?

上次大家说了哪些是windows编程?驾驭到Windows API
编制程序、Windows编制程序、Windows SDK 编程是八个定义。

2.2       Windows API 的功效分类.. 7

  犹如C语言中日常应用printf函数,这一个函数挺风趣的,应该为函数输入的参数是从未界定个数的,相当于是随机退换的。比方:

后天大家利用C语言来贯彻您的首先个真正的Windows程序。

2.2.1       系统宗旨服务.. 7

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main(){
 5
 6     int x=100, y=200, z=300;    
 7     
 8     printf("%d %d %d.n", x, y, z);
 9     system("pause");
10     return 0;
11 }

windows.h 头文件介绍:

2.2.2       系统管理.. 9

 

编写Windows程序,首先要含有 windows.h 头文件。windows.h
还满含了其他部分Windows头文件,譬如:

2.2.3       顾客分界面.. 9

  这几个printf函数不仅仅还可以多少个参数打字与印刷,还能用来直接打字与印刷变量,不过MessageBox却不能够一向打字与印刷,这些引起我的第一手思忖。作者先想到的是成立叁个缓冲区,利用这些缓冲区取打字与印刷字符数量。当然打字与印刷的函数得使用sprintf了

windef.h:基本类型定义

2.2.4       图像和多媒体.. 15

  

winbase.h:内核函数

2.2.5       网络.. 15

 1 int main(){
 2     
 3     int a = 12;
 4     char szBuffer[100];             // 使用一个字符数组来做缓冲区
 5 
 6     sprintf(szBuffer, "helloworld %d.n", a);
 7     _snprintf(szBuffer, 100, "helloworld %d.n", a);
 8         // 使用_snprintf函数比较安全,因为可以输入限定字符的个数  
 9 
10     printf("%s.n", szBuffer);
11     puts(szBuffer);                            // 可以使用printf中的%s将szBuffer打印出来,或者用puts直接输出
12     //printf("helloworld.n");
13 
14     system("pause");
15     return 0;
16 }

wingdi.h:客户接口函数

2.2.6       别的功效.. 15

 

winuser.h: 图形设备接口函数

2.3       Windows API核心DLL. 16

  这么些缓冲区的办法倘诺用在MessageBox函数里面,就能够完结打印变量的点子,譬喻以下代码:

这一个头文件定义了Windows的持有数据类型、函数原型、数据结构和标识常量,也便是说,全体的Windows
API都在此些头文件中声称。

2.3.1       Kerne132.dll 16

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    int a = 12;

    TCHAR szBuffer[100];                  // 通用版本
    _stprintf(szBuffer, TEXT("hello 通用 %d"), a);
    MessageBox(NULL, szBuffer, TEXT("通用"), MB_OK  | MB_ICONINFORMATION);

    return 0;
}

在C语言中,程序都以“黑屏”的,称为调控台程序(Console
Application)。那套教程要讲的是带分界面包车型客车Windows程序(Windows
Application),也称之为GUI程序(GUI Application)。

2.3.2       User32.dll 16

 

调节台程序以 main() 为入口函数,Windows程序以 WinMain()
为入口函数,动态链接库以 DllMain()
为入口函数,分化的入口函数决定了分歧品种的前后相继。

2.3.3       Gdi32.dll 16

  可是每一次都写个缓冲区来寄存,而且一不下心忘记行使_snprintf函数,那就GG了,很或然发生缓冲区溢出的危殆。因此,这里运用printf原先函数设计的规律,大家也来统筹四个MessageBoxPrintf();函数,用那么些函数来落到实处格式化输出的效应,要落实那些函数,首先得参谋printf();函数的兑现原理。

WinMain() 函数的原型为:

2.3.4       标准C函数.. 17

int my_printf(const char * szFormat, ...){

    int iReturn;
    va_list pArgs;

    va_start(pArgs, szFormat);
    iReturn = vprintf(szFormat, pArgs);
    va_end(pArgs);

    return iReturn;
}


int main(){

    int x=100, y=200, z=300;

    printf("hello %d, %d, %d.n", x, y, z);        
    my_printf("test_my_printf,哈哈%d %d.n", x, y);

    system("pause");
    return 0;
}

int WINAPI WinMain(

2.3.5       其他Dll 17

 

HINSTANCE hInstance, // 当前窗口句柄

2.4       Unicode和多字节.. 17

  …代表的情致是传播的参数是可变参数个数的,va_start(pArgs,
szFormat);表示指向szFormat之后的叁个参数,那些函数的大多事物自个儿以往也还未有掌握过来,之后再来补充,然如今后依葫芦画瓢那么些函数大家能够和谐写个MessageBoxPrintf();函数,具体代码如下:

HINSTANCE hPrevInstance, //
前二个窗口句柄,Win32下为NULL(Win16贪求无厌的废品,前段时间已弃用卡塔 尔(英语:State of Qatar)

2.4.1       W版本和A版本的API 21

// 自己做一个格式化的messageboxprintf对话框
int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...){

    TCHAR szBuffer[1024];
    va_list pArglist;

    va_start(pArglist, szFormat);
    _vsnprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArglist);
    va_end(pArglist);

    return MessageBox(NULL, szBuffer, szCaption, MB_OK | MB_ICONINFORMATION);
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){

    int x=100, y=200, z=300;
    int cxScreen, cyScreen;

    cxScreen = GetSystemMetrics(SM_CXSCREEN);
    cyScreen = GetSystemMetrics(SM_CYSCREEN);

    // MessageBoxW(NULL, L"helloworld", L"biaoti", MB_OK);
    // MessageBoxA(NULL, TEXT("helloworld"), TEXT("biaoti"), MB_OK);
    MessageBoxPrintf(TEXT("我的标题"), TEXT("hello %d %d %d"), x, y, z);    // 把这个函数做好后,直接就可以输出
    MessageBoxPrintf(TEXT("我的屏幕大小"), TEXT("我的屏幕宽度是:%d.n高度是:%d.n"), cxScreen, cyScreen);


    return 0;
}

LPST福特Explorer lpCmdLine, // 命令行参数

2.4.2       Unicode与ASGII的转换.. 22

  也就是本身布置出来四个贴近printf的小工具,因为微软确实未有规划MessageBox中开展格式化输出的函数。

int nCmdShow // 窗口显示方式

2.4.3       对Windows程序设计规范的提出.. 22

);

2.5       小结.. 23

先不要打草惊蛇明白这么些参数的意思,小编先给大家写二个简短的不带黑屏的、真正的Windows程序:

 

#include

 

int WINAPI WinMain(

 

HINSTANCE hInstance,

2.1    Windows数据类型

Windows API 使用了累累 Windows 本身定义的数据类型。读者或然相比熟习 C
语言或 C++语言的数据类型。要烂熟运用 Windows API 应当要纯熟 Windows
数据类型。那些数据类型是Windows 特有的。在 SDK 的相关头文件中有定义。

在不菲的Windows 数据类型中,最常用的有
DWO奥迪Q7D、HANDLE、LPTST大切诺基、WOHavalD、BYTE、CHALacrosse 等。在 Windows 系统中,DWO牧马人D
用于表示无符号整型的多少,意为 double word,叁11位。

在相近意况下 BYTE 是 8 位的,而 WO途达D 是 16 位,DWOEvoqueD 正是 32 位的。

Windows 系统的应用程序中还保有三个有意的数据类型-HANDLE,平常 HANDLE
类型的变量用于唯后生可畏标志四个“对象”,如窗口、控件、文件等,Windows
平新竹存在许多那样的目的,对象是程序操作的目的。HANDLE 也是叁个 31位的数据类型。

HINSTANCE hPrevInstance,

2.1.1    Windows数据类型示例

实例2-1运用了二种为主的 Windows 数据类型,演示 Windows
数据类型在程序中的使用办法。

  1. 实例2-1 常用Windows数据类型演示(DWOHighlanderD/LPST奥迪Q5/CHAENCORE/INT卡塔尔

本实例定义了多少个常用常量的 Windows 数据类型,满含 DWOEscortD,LPST传祺 和
CHA揽胜,并演示了怎么样利用它们实行了复制、相当大小等操作。

/* ************************************
*《精通 Windows API》 
* 示例代码
* windata.c
* 2.1.1  常用的 Windows 数据类型
**************************************/
/* 头文件  */
#include <windows.h>
#include <stdio.h>
/* ************************************
* 功能  Windows 数据类型演示
**************************************/
int WINAPI WinMain( 
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//定义字符串
LPSTR szString = "Windows data type, string.";
//定义字符数组
CHAR lpString[120];//要大于 szString 的长度
//定义 DWORD 类型的数据
DWORD dwMax = 0xFFFFFFFF;
DWORD dwOne = 0x1;
//定义 INT 类型的数据
INT iMax = 0xFFFFFFFF;
INT iOne = 0x1;
//显示字符串
MessageBox(NULL,szString,"LPSTR",MB_OK);
//复制内存,将字符串复制到数组中(包括 NULL 结束符)
CopyMemory(lpString, szString,lstrlen(szString)+1);
//显示复制的字符串
MessageBox(NULL,lpString,"CHAR[]",MB_OK);
//比较 DWORD 并显示结果
if(dwMax>dwOne)
{
MessageBox(NULL,"DWORD 类型的数据 OxFFFFFFFF > 0x1","DWORD",MB_OK);
} 
//比较 INT 并显示结果
if(iMax<iOne)
{
MessageBox(NULL,"INT 类型的数据 OxFFFFFFFF < 0x1","INT",MB_OK);
}
return 0;
}

 

 

在此个顺序中,使用了 4 种 Windows 数据类型,分别是 LPST奥迪Q7、CHA凯雷德、DWO昂CoraD 和
INT。

LPST凯雷德 类型的多少是字符串,也正是字符指针,CHAEscort 是字符,DWOWranglerD 是 三十几个人的无符号整数,INT 是 32 位有号子整数。程序运维后会弹出 4
个对话框。这表明 dwMax>dwOne 是白手起家的。iMax<iOne 也是创立的。dwMax与 i马克斯 的数值是相似的,dwOne 与 iOne
的数值也是同意气风发的。但是比较结实差异,是因为双方的数据类型不风姿浪漫致。

 

  1. 查阅Windows数据类型的定义

在 Visual Studio
中能够查阅数据类型的定义。在数据类型的花色名(譬如“DWOTiggoD”卡塔尔国上单击右键,选拔“转到定义”,如图
2-1 所示。

 图片 2

图2-1

能够从 SDK 的头文件中观察各品种的类型定义。

“INT”的概念如下:

 typedef int                 INT;

 

“DWOPAJEROD”的概念如下:

 typedef unsigned long       DWORD;

 

“CHA奥迪Q5″的定义如下:

 typedef char CHAR;

 

    从当中能够窥见,那些 Windows 数据类型都以从规范 C
的数据类型经过类型重定义而来。INT 数据类型是有暗记整型,DWO瑞虎D
数据类型是无符号整型。 这就认证了为什么在实例 2-1 中 INT 数据类型的变量
i马克斯 实际是“-1”,而 DWO福特ExplorerD 类型的变量 dw马克斯实际是“4294967295”,所以会冒出如上的可比结实。

  1. 最广大的Windows数据类型

表2.1 常用的主导Windows数据类型

类型

描述

BOOL

布尔型变量(值只能是True或False)

BYTE

字节类型(8位)

CHAR

8比特字节(ANSI)

CONST

常量,相当于标准C中的”const”关键字

DWORD

32字节无符号整型数据

DWORD32

32字节无符号整型数据

DWORD64

64字节无符号整型数据

FLOAT

浮点数据类型

HANDLE

对象的句柄,最基本的句柄类型

HICON

图标的句柄

HINSTANCE

程序实例的句柄

HKEY

注册表键的句柄

HMODULE

模块的句柄

HWND

窗口的句柄

INT

32位符号整型数据类型

INT_PTR

指向INT类型数据的指针类型

INT32

32位符号整型

INT64

64位符号整型

LONG

32位符号整型,相当于C语言的标准数据类型long

LONGLONG

64位符号整型

LONG32

32位符号整型

LONG64

64位符号整型

LPARAM

消息的L参数

WPARAM

消息的W参数

LPCSTR

Windows(ANSI)字符串常量

LPCTSTR

根据环境配置,如果定义了UNICODE宏,则是LPCWSTR类型,否则是LPCSTR类型

LPCWSTR

UNICODE字符串常量

LPDWORD

指向DWORD类型数据的指针

LPSTR

Windows(ANSIC)字符串常量

LPTSTR

根据环境配置,如果定义了UNICODE宏,则是LPTSTR类型,否则是LPSTR类型

LPWSTR

UNICODE字符串常量

SHORT

无符号短整型(16位)

SIZE_T

表示内存大小,以字节为单位,其最大值是CPU最大寻址范围

TCHAR

如果定义了UNICOD,则为WCHAR,否则为CHAR

UCHAR

无符号CHAR

UINT

无符号INT

ULONG

无符号LONG

VOID

无类型,相当于标准C语言的void

WCHAR

16位Unicode字符

WINAPI

Windows API的函数调用方式,常见于SDK头文件中对API函数的声明中,相当于__stdcall(更严格讲,不是数据类型,而是函数调用约定)

WORD

16位无符号整型数据

  1. Windows数据类型名称命名的法规

Windows 数据类型的命名都很有规律。

宗旨数据类型包蕴 BYTE、CHAWrangler、WO揽胜极光D、SHORT、DOWRAV4D、INT 等。

指针类型的下令形式相同是在其针对性的数据类型前加“LP”或“P”,比方对准DWO本田CR-VD的指针类型为“LPDWO陆风X8D”和“PDWOSportageD”。

各种句柄类型的通令格局相像都以在对象名前加“H”。Windows
系统中有为数不菲指标,全部代表三个目的的数据类型都以句柄,每大器晚成种对象都对应着意气风发种句柄类型,举例与位图(
BITMAP)对应的句柄类型为“HBITMAP”,与菜单(MENU)对应的句柄类型为“HMENU”,与窗口(WINDOW)对应的句柄类型为“HWND”。无符号类型日常是以“U”早先,举个例子“INT”是标识类型,“UINT”是无符号类型,“LONG”是符号类型“ULONG”是无符号类型等。

LPSTR lpCmdLine,

2.1.2    Windows 数据类型与标准C 数据类型的涉及

查阅 Windows 数据类型的定义能够看出,全部的 Windows 数据类型都以由 C
数据类型经过类型重定义获得的。如 DWO大切诺基D 实质上正是 unsigned long
数据类型,32 位的无符号整型:

typedef unsigned long       DWORD;

 

实际 VC 编译器是三个完完全全的 C 编写翻译器,此外并从未过多的增加。Windows
数据类型亦非 VC 的内建项目,而从专门的工作 C 类型重定义得到。

int nCmdShow

2.1.3    Windows 数据类型与Windows API

Windows API 函数的参数、重返值或局部珍视的常量使用的数据类型都以 Windows
数据类型。如:

int MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption, 
UINT uType
);

 

MessageBox 函数的重临值是 int 型的,是正式 C
数据类型,可是全数的参数都选取了Windows 数据类型。如 HWND 是生机勃勃种 W
indows 数据类型,用于表示窗口的句柄;LPCTST昂Cora 也是Windows
数据类型,表示字符串常量;UINT 也是 Windows 数据类型,为无符号整型。

){

2.1.4    Windows 中的数据结构

Windows 中隐含很种种数据结构类型,在分化类其余 API
中会使用到区别的数据结构,由于数据结构的数目过多,将要三番两回章节具体的实例中介绍完结每生龙活虎种功用所选取的数据结构。数据结构平常会作为一些
API 的参数输入。

typedef struct _WIN32_FILE_ATTRIBUTE_DATA{
DWORD    dwFileAttributes;
FILETIME  ftCreationTime;
FILETIME  ftLastAccessTime;
FILETIME  ftLastWriteTime;
DWORD    nFileSizeHigh;
DWORD    nFileSizeLow;
} WIN32_FILE_ATTRIBUTE_DATA,*LPWIN32_FILE_ATTRIBUTE_DATA;

 

相当于:

typedef struct _WIN32_FILE_ATTRIBUTE_DATA{
DWORD    dwFileAttributes;
FILETIME  ftCreationTime;
FILETIME  ftLastAccessTime;
FILETIME  ftLastWriteTime;
DWORD    nFileSizeHigh;
DWORD    nFileSizeLow;
};
typedef _WIN32_FILE_ATTRIBUTE_DATA WIN32_FILE_ATTRIBUTE_DATA;
typedef _WIN32_FILE_ATTRIBUTE_DATA *LPWIN32_FILE_ATTRIBUTE_DATA;

 

Windows SDK 中,结构体也许有投机的命名标准。一般景观下,Windows
系统中使用全大写来命名结构体、共用体,并应用“_”来分隔单词,在构造名加“LP”或“P”表示针对数据结构的指针。

// 调用API 函数MessageBox

2.2    Windows API 的效能分类

Windows API
所能实现的成效包蕴过多下边,在扩充应用程序的费用时,开拓人员可能会选取到文件、进度、内部存款和储蓄器、权限、系统音信等种类的中坚服务和种类处理类的
API,或许会用到图形客户分界面、控件等函数和对象,只怕必要在分界面上绘制图像管理多媒体新闻等,还包罗进行网络通信支出等。

int nSelect = MessageBox(NULL, TEXT, TEXT(), MB_OKCANCEL);

2.2.1    系统中央服务

系统大旨服务是 Windows API
最宗旨的剧情,是最常使用到的程序接口。系统基本服务API 包涵以下多少个地点。

  1. 文件系统

对文件的基本操作包涵文件的创造、展开、读写、关闭、删除,文件属性的装置与收获,目录操作,以致磁盘分卷的操作,还包蕴镜像文件、加密文件系统等。

  1. 内部存款和储蓄器管理

最首假如内在的分配、分享、释放等剧情,满含虚构内部存储器管理、分页机制、堆管理等。

  1. 进程、线程和模块

满含进度主程序(
exe)、模块、动态链接库(dll)的编纂;线程的基本概念,线程制造、遍历、同步等操作;进度与权力;线程与纤程等剧情。

  1. 配备 I/O、驱动程控

回顾设备对象等基本概念。加载与卸载驱动程序,调整驱动程序,与驱动程序通讯等。

  1. 调解与错误处理

归纳怎么着支付调节和测验器,程序运营错误的拍卖,日志的笔录、Windows
可实践文件的布局等。

  1. Windows 系统消息

富含注册表的操作,如展开注册表,读取、写入键值,创立、删除键;还包罗系统基本消息的拿走和安装,如系统目录、系统版本、Computer名等。

  1. 进度间通讯

包括利用分享文件进行进度间通讯的主意,使用音讯实行进程间通信的秘技,使用邮槽、管道等实行进度间通讯的章程,使用互联网共享进行进度间通讯的措施。

  1. 放大计时器与音信机制

消息机制是 Windows 系统中超级重大的大器晚成种体制。差十分少拥有的 Windows
应用程序都在与音信打交道,而 Windows
的新闻机制又是借助于沙漏的。所以掌握 Windows 音讯机制是上学Windows
应用程序开辟的紧要内容。

  1. 其他

Windows
的系统基本服务还包括质量监视、电源管理、索引与数码存款和储蓄等,也将要本书中具备关联。

  1. 实例 2-2 将系统目录音信写入 systemroot.txt

本实例使用了 Windows 系统大旨服务中的部分
API,完毕将系统目录路线写入文件中。在那间不对达成原理做过多的解说,只是使读者对
Windows 系统服务 API 有最早的打听。

/* ************************************
*《精通 Windows API》 
* 示例代码
* basic.c
* 2.2 Windows API 的功能分类
**************************************/
/* 头文件  */
#include <windows.h>
/* ************************************
* 功能  获取系统目录信息,并存储到文件中
**************************************/
int main(int argc, TCHAR argv[])
{
//文件句柄
HANDLE hFile;
DWORD dwWritten;
//字符数组,用于存储系统目录
TCHAR szSystemDir[MAX_PATH];
//获取系统目录
GetSystemDirectory(szSystemDir,MAX_PATH);
//创建文件 systemroot.txt
hFile = CreateFile("systemroot.txt",
GENERIC_WRITE,
0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//判断文件是否创建成功
if(hFile != INVALID_HANDLE_VALUE)
{
//将系统目录系统信息写入文件
if(!WriteFile(hFile,szSystemDir,lstrlen(szSystemDir),&dwWritten,NULL))
{
return GetLastError();
}
}
//关闭文件,返回。
CloseHandle(hFile);
return 0;
}

 

运作程序,在前后相继所在的目录会生成文书“systemroot.txt”,文件内容为系统目录。

if(nSelect == IDOK){

2.2.2    系统一管理理

系统一管理理是 Windows 系统中很入眼的开始和结果。Windows 系统提供了以下方面包车型客车 API
供应用程序开荒人士使用,富含:管控台接口、程序安装、系统苏醒、职分调治、Windows
运程管理。

MessageBox(NULL, TEXT(“你点击了“显著”按键”), TEXT, MB_OK);

2.2.3    客户分界面

客商分界面开垦是 Windows 应用程序开采的最首要内容。Windows
客商分界面首要富含多个部分,Windows Shell 和 Windows 图形客商分界面。Windows
图形顾客分界面包蕴窗口对象的相干内容,分界面能源,控件、客户数据交流(粘贴板等卡塔 尔(阿拉伯语:قطر‎和客商输入的拍卖。

  1. 窗口化

归纳部分基本数据概念和对象:窗口类、音讯对列、窗口进度(新闻管理函数卡塔尔、窗口属性等。
主要不外乎的 API
有窗口类注册的函数、窗口构造建设与关闭函数、窗口属性改良函数等。

  1. 资源

财富是 Windows
应用程序中很入眼的生龙活虎项内容,在可试行文件中,特地有用于存款和储蓄财富的节。
这里所说的能源是分界面财富,包含Logo、菜单、字符串、版本音信、对话框、动态光标、插入号(Carets)等。财富的拍卖涉及好些个API 函数。

  1. 客户输入管理

席卷对话框、键盘加快器(快捷键卡塔尔、键盘输入、鼠标输入、原始数据输入等。这一个概念是程序通过客户分界面与客商展开人机联作的基本概念。

  1. 数据沟通

席卷 Atom
表(包蕴了多少字符串和标记符卡塔尔国、粘贴板、数据复制、动态数据交接等基本概念,是顾客和应用程序通过客商分界面举行数据交流的第少年老成载体。

  1. Windows 图形分界面通用控件

Windows 系统提供了不菲于 30 种的控件供应用程序采用,个中最常用的三种包罗Edit控件(文本框卡塔 尔(英语:State of Qatar)、Button 控件(开关卡塔尔国、ListView 控件(列表卡塔尔国、ToolTip
控件(提醒框卡塔 尔(阿拉伯语:قطر‎、ComboBox 控件(下拉选拔框卡塔 尔(阿拉伯语:قطر‎、Tree-View
控件(树卡塔尔、Rich-Edit 控件(多功用文本框卡塔 尔(阿拉伯语:قطر‎、Tab 控件(分页卡塔尔国、Process
控件(进程条卡塔尔国等。

  1. Windows Shell

Windows 桌面浏览器(explorer.exe)的功用强盛,Windows Shell
应用程序能够使用WindowsShell
桌面包车型客车程序接口到达管理种类、定制图标和暗中同意程序、扩张桌面功用等指标。

  1. 实例 2-3 窗口成立以致音信管理 basic.c

    / **《精通 Windows API》

    • 示范代码
    • window.cpp
    • 2.2 Windows API 的功能分类
      **/
      / 预处理 /
      / 头文件 /
      #include
      / 全局变量 /
      HINSTANCE hinst;
      / 函数注脚 /
      int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
      LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
      /* **
    • 意义 展现一个窗口
      **/
      int WINAPI WinMain(HINSTANCE hinstance,
      HINSTANCE hPrevInstance,
      LPST奥迪Q7 lpCmdLine,
      int nCmdShow)
      {
      WNDCLASSEX wcx; // 窗口类
      HWND hwnd; // 窗口句柄
      MSG msg; // 音讯BOOL fGotMessage; // 是还是不是成功博得信息hinst = hinstance; // 应用程序实例句柄,保存为全局变量
      // 填充窗口类的数据结构
      wcx.cbSize = sizeof(wcx); // 结构体的深浅
      wcx.style = CS_HREDRAW |
      CS_VREDRAW; // 样式:大小改造时重绘界面wcx.lpfnWndProc = MainWndProc; // 窗口音讯管理函数
      wcx.cbClsExtra = 0; // 不选取类内存wcx.cbWndExtra = 0; // 不行使窗口内存
      wcx.hInstance = hinstance; // 所属的应用程序实例句柄
      wcx.hIcon = LoadIcon(NULL,
      IDI_APPLICATION); // 图标:默认
      wcx.hCursor = LoadCursor(NULL,
      IDC_ARROW); // 光标:默认
      wcx.hbrBackground = (HBRUSH)GetStockObject(
      WHITE_BRUSH); // 背景:浅紫蓝wcx.lpszMenuName = NULL; // 菜单:不应用
      wcx.lpszClassName = “MainWClass”; // 窗口类名
      wcx.hIconSm = (HICON)LoadImage(hinstance, // 小LogoMAKEINTRESOURCE(5),
      IMAGE_ICON,
      GetSystemMetrics(SM_CXSMICON),
      GetSystemMetrics(SM_CYSMICON),
      LR_DEFAULTCOLOENVISION);
      // 注册窗口类
      if(!RegisterClassEx(&wcx))
      {
      return 1;
      }
      // 创立窗口
      hwnd = CreateWindow(
      “MainWClass”, // 窗口名
      “CH 2-3”, // 窗口标题WS_OVE瑞鹰L应用程式EDWINDOW, // 窗口样式
      CW_USEDEFAULT, // 水平地方 X:默许CW_USEDEFAULT, // 垂直地点 Y:默许
      CW_USEDEFAULT, // 宽度:默认
      CW_USEDEFAULT, // 中度:暗中认可(HWND) NULL, // 父窗口:无
      (HMENU) NULL, // 菜单:使用窗口类的菜系
      hinstance, // 应用程序实例句柄
      (LPVOID) NULL); // 窗口成立时数据:无
      if (!hwnd)
      {
      return 1;
      }
      // 呈现窗口
      ShowWindow(hwnd, nCmdShow);
      UpdateWindow(hwnd);
      // 音讯循环
      while (
      (fGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0
      && fGotMessage != -1)
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
      return msg.wParam;
      }
      /* **
    • MainWndProc
    • 成效 窗口语资源信息息管理函数,
      对富有的新闻都利用私下认可管理函数
      **/
      LRESULT CALLBACK MainWndProc(HWND hwnd,
      UINT uMsg,
      WPARAM wParam,
      LPARAM lParam
      )
      {
      switch (uMsg)
      {
      case WM_DESTROY:
      ExitThread(0);
      return 0;
      default:
      return DefWindowProc(hwnd, uMsg, wParam, lParam);
      }
      }

 

实例中,首先注册了窗口类,然后创制了贰个窗口,成立窗口时钦点的窗口的属性和窗口音讯的管理函数。函数音信的处理函数多数调用系统默许函数来拍卖。如下:

D:02>cl window.cpp user32.lib gdi32.lib
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.21022.08 版
版权所有(C) Microsoft Corporation。保留所有权利。
window.cpp
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
/out:window.exe
window.obj 
user32.lib
gdi32.lib

 

运行效果:

 图片 3

}else{

2.2.4    图像和多媒体

Windows 的图像引擎和多媒体编制程序有多样接口,包涵最大旨的
GDI、GDI+,以致更加高端的OpenGL、DirectX 等图像引擎编制程序接口。DirectX 和
OpenGL
在嬉戏开荒、动画制作等方面利用比较普及,使用它们进行应用程序开荒需求非常的
SDK。本书只解说 GDI,对常常的应用程序开垦,已经丰盛使用。

GDI
的基本概念包蕴图像(Image)、位图(Bitmaps卡塔 尔(阿拉伯语:قطر‎、笔(Pen)、画刷(Brush)、文本和字体(
Text and
Fonts)、线(Line)、区域(Regions)、形状(Shapes)等。其宗旨的效果与利益是对呈现设备开展调控、获取和改造有关配置,在微微处理机荧屏上海展览中心示客户所急需出示的原委。

MessageBox(NULL, TEXT(“你点击了“裁撤”按键”), TEXT, MB_OK);

2.2.5    网络

顾客使用 Windows API 能够付出基于各个互连网公约的应用程序,比方 TCPUDP
Socket、HTTP、DHCP、RPC、QOS、蓝牙5.0,甚至写真、点对点文件传输、即插即用设备管理等。
仍为能够张开互连网管理,包括互连网的主导音信,使用 IP helper
获取互连网布局和网络音信、实行网络监视等。
相同的时间微软还提供了进展网络安全编制程序的生龙活虎部分接口,首要是防火墙 Windows、防火墙
API,以致部分 Windows 自带的网络应用程序的接口,满含 IE、Outlook 等。

}

2.2.6    别的成效

Windows API
能完结的功用还大概有众多,限于篇幅无法一切介绍。有部分剧情本书未涉及,但是Windows API 也提供了有关接口。

  1. 多少存款和储蓄和做客、数据库

席卷微软的“动态数据存取组件”手艺(MDAC,包括了 ADO、ODBC)、OLE
数据库、XML 标准、微软 XML、可扩张存在引擎等多地点内容。首即使 Windows
系统内的数据库文件、Windows.系统对数据库的拜访接口等手艺。

2.音信与合营

新闻与合作比较多是 Windows
系统自带的部分应用程序所提供的付出接口。当中最要紧的内容是“同盟数据对象”(
CDO)。CDO 包含了多少种 Windows 数据传输典型应用,包蕴 Mssager
(MSN)、邮件 SMTP (Outlook)应用接口等。

3.Web 开发

IIS(Intemet Information
Server,网络消息服务卡塔尔等应用程序提供的开垦接口,使用户能够一向在
Windows 平台上开展 Web 开拓,开采的程序运维于 ns
框架下。“数据存在与拜候”、“音信与协作”、“Web 开采”等都能够归为 COM
开拓的限定内。COM 是 Windows
应用程序接口的后生可畏种,具备一定的接口格局,好些个是 Windows
系统中自带的应用程序所提供的开荒接口的集合。

return 0;

2.3    Windows API核心DLL

在 Windows 的系统目录中,存在重视重的动态链接库文件(DLL 文件)。那些 DLL
文件中 包罗了 Windows API 函数可执路程序。DLL
将各函数“导出”,那样应用程序就足以找到 DLL中的函数地址,当应用程序调用
Windows API 时,程序会运维到 DLL 中。API
函数根本设有于多少个主导的动态连接库文件中。Keme132.dll 是最重视的
DLL,Windows 系统最根本的体系服务 API 函数都存在于 Kerne132.dll
中。User32.dll 主要回顾图形顾客界面中所使用到的豆蔻梢头对函数接口。 GDI32.dll
中,主要不外乎 Windows 图形引擎中的接口函数。

当顾客调用贰个 API 时,系统会通进度序文件中的导入表结构找到须要调用的
API 函数位于哪个 DLL,分明函数的地址,以便应用程序能够成功调用 API
函数。

}

2.3.1    Kerne132.dll

Keme132.dll 包涵了系统基本服务中最中心的 API
函数,如文件系统、进度与线程、内部存款和储蓄器管理等。 Windows XPSP2
系统中,Keme132.d11 有 948个导出函数,举个例子,CreateFileA、CreateProcessA、OpenThread、SetFileTime
等。本书就要继续章节中通超过实际例介绍那些 API的行使。

运作结果:

2.3.2    User32.dll

User32.dll 是 Windows
图形客商分界面包车型客车要紧支撑。一些第生龙活虎的图形客商分界面函数由User32.dll
函数导出。Windows XP SP2 系统中,User32.dll 有 732个导出函数,举个例子CreateWindowExW、RegisterClassA 等。

图片 4

2.3.3    Gdi32.dll

Gd132.dll 是 Windows GDI 应用程序设计接口,Gdi32.dll
导出了与此相关的大多函数,如 GetTextColor、LineTo、TextOutA 等。

点击“鲜明”或“撤销”开关,又会弹出三个新的提醒框。大家能够亲自运营一下,会有实在的体会。

2.3.4    标准C函数

正规 C 程序是风度翩翩种标准,任何扶持 C 语言应用程序开拓的系统都应有提供 C
语言库函数的 调用。在系统遇到下利用正规 C
举行程序支付时,客户所利用的库函数实际上是由操作系统提供的。便是出于各种主流操作系统都提供了后生可畏套规范C 库所定义的函数接口,标准 C
函数库才会有那般广阔的超过操作系统平台。所以 C
程序依旧依附于操作系统开垦人士为其实现接口,而 C
库函数的完结依旧依附于操作系统提供的调用接口,如正式 C 函数 fopen
函数在Windows 系统中的达成就凭仗于 API CreateFile 函数(CreateFile
完毕了文件的成立和开采等操作卡塔尔国。

Windows 系统的 C 规范库函数接口首要存在于crtdll.dll 中。实际上,C
规范函数库必得由操作系统为其提供接口,不然使用正式 C
开辟的次序不可能在一定的体系上运行。 Windows XP SP2 系统中,crtdll.dll 有
526 个导出函数,如 fopen、printf. strlen等。

原本没有main()函数,未有#include 的C语言程序也是足以运作的!

2.3.5    其他Dll

本来,Windows 系统中的 DLL 文件远远不仅那多少个,Windows
系统提供了特别丰盛而且成效强盛的 API,上文已经介绍了 Windows API
所主要信赖的多少个 DLL,其余的 DLL
库文件由于过火庞杂,就不生龙活虎一介绍,将要一连的章节中保有涉及。读者只须要领会调用
Windows API 的基本原理就足以了。

MessageBox()
函数是贪婪无餍API中的一个,用于弹出二个点名风格的对话框,其原型为:

2.4    Unicode和多字节

Windows 不仅能够使用 Unicode
字符集又能够应用古板的字符集(如多字节编码卡塔 尔(阿拉伯语:قطر‎来完毕对四种语言的扶植,以适应国际商场的渴求。与历史观的字符集编码比较,Unicode
是世界通用的字符编码典型,使用 16 位数据表示二个字符,风华正茂共能够代表 65535
种字符,能够包罗现代Computer中所使用的持有字符,包涵各样字母、文字、在出版业中使用的特殊符号等。
守旧的字符集,如 Windows ASNI 字符集,使用 8 位数据或将紧邻的四个 8
位的多少整合在一块表示非常的语言字符。Windows 系统采用了 ASNI
字符的恢弘方式,要是二个字节是负数,则将其继续的一个字节组合在合营表示三个字符。这种编码格局的字符集也称得上“多字节”字符集。

在 Windows 系统中,Unicode 字符编码和多字节字符编码都可以动用。

  1. 实例 2-4 Unicode 与多字节编码演示

    / **《精通 Windows API》

    • 示范代码
    • StringCode.c
    • 2.4 Unicode 和多字节
      **/
      / 预处理 /
      / 头文件 /
      #include
      /* **
    • 意义 Unicode 与多字节编码演示
      **/
      int WINAPI WinMain(
      HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPSTENVISION lpCmdLine,
      int nCmdShow
      )
      {
      //定义 LPWSTEscort 类型的宽字符串
      LPWST奇骏 szUnicode = L”This is a Unicode String;”;
      //定义 LPST兰德酷路泽 类型的窄字符串
      LPSTGL450 szMutliByte = “This is not a Unicode String;”;
      //定义 LPTST奥迪Q7 类型的自适就字符串
      LPTSTENVISION szString = TEXT(“This string is Unicode or not depends on the option.”);
      //使用 W 版本的 API 函数,以宽字符串为参数。
      MessageBoxW(NULL,szUnicode,L”<字符编码 1>“,MB_OK);
      //使用 A 版本的 API 函数,以窄字符串为参数。
      MessageBoxA(NULL,szMutliByte,”<字符编码 2>“,MB_OK);
      //使用自适用的 API 函数,接纳相适应的字符串类型为参数。
      MessageBox(NULL,szString,TEXT(“<字符编码 3>“),MB_OK);
      return 0;
      }

 

在本实例中,风姿浪漫共动用了 3
类别型的字符串变量,每种类型的字符串变量的初叶化是分歧的,如表 2.2
所示。

表2.2 字符串与初叶化

类型

变量类型

初始化形式

Unicode

LPWSTR

L”string”

多字节

LPSTR

”string”

根据开发环境的设置自动适应

LPTSTR

TEXT(”string”)

本实例首先选取“多字节”方式开展编写翻译。能够应用二进制编辑器来查阅编写翻译获得的可实施文件,上例中定义的字符串分别存款和储蓄为以下情势。使用二进制编辑器查看,能够从
exe可实行文件中找到如下音讯。读者能够对照 ASCII 编码表查看。

“This is a Unicode String;”使用 Unicode 格局的十八进制编码:

54 00 68 00 69 00 73 00 20 00 69 00 73 00 20 00 61 00 20 00 55 00 6e 00 69 00 63 00 6f 00 64 00 65 00 20 00 53 00 74 00 72 00 69 00 6e 00 67 00 3b 00

 

 图片 5

“This is not a Unicode String;”使用 ASCII 方式的十七进制编码:

54 68 69 73 20 69 73 20 61 20 55 6e 69 63 6f 64 65 20 53 74 72 69 6e 67 3b

 

 图片 6

“This string is Unicode or not depends on the option.”的ASCII
方式的十九进制编码:

54 68 69 73 20 73 74 72 69 6e 67 20 69 73 20 55 6e 69 63 6f 64 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 6f 70 74 69 6f 6e 2e

 

而后是“<字符编码 1>”和 Unicode 编码、“<字符编码
2>”和“<字符编码
3>”的多字节编码。对汉字字符,二种编码的法子是莫衷一是的,如“字符编码”多个字,三种编码分别为:

Unicode编码

57 5b 26 7b 16 7f 01 78

 

 图片 7

和多字节ASCII

d7 d6 b7 fb b1 e0 c2 eb

 

 图片 8

读者能够深入分析设置使用 Unicode
字符集后编写翻译完毕的可实施文件与安装为多字节字符集后编写翻译取得的可实施文件有怎么样两样。

 

  1. 在工程布署中精选编码方式

设置的主意是在Visual
Studio工程属性中甄选“配置属性”→“常规”→“字符集”选项中开展精选。

int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,
UINT uType );

2.4.1    W版本和A版本的API

Windows 帮衬 Unicode 和 ASCII 编码的字符。Windows 系统 API
凡是以字符串作为参数的过多独具 W 和 A
多少个本子以落实二种不一致编码的字符处理。

上边以 MessageBox 为例介绍三种区别版本 API 函数的施用。在 User32.dll
中程导弹出的函数实际上并未有 MessageBox,独有 Message博克斯A 和
MessageBoxW,那二者是同二个 API,完结了千篇豆蔻梢头律的信守。分裂的是,MessageBoxA
以多字节字符串作为参数输入,MessateBoxW 以Unicode 字符串作为参数输入。

能够从 User32.dll 的导出函数见到多个例外版本的 API 函数。在 Platform SDK
中,MessageBox 函数扬言所在的头文件中开采如下概念(以下代码来自于
Microsoft Platform SDK):

WINUSERAPI
int
WINAPI
MessageBoxA(
__in_opt HWND hWnd,
__in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption,
__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType);
#ifdef UNICODE
#define MessageBox MessageBoxW
#else 
#define MessageBox MessageBoxA
#endif // !UNICODE

 

能够看出,在程序实行编写翻译和一连时,假若程序在 UNICODE 情状下,会选取Message博克斯W,否则使用 MessageBoxA。

软件开垦职员可以活动设定使用 Unicode
编码或都多字节编码文件,不影响程序的常规职能。

但要是在编写程序时,使用的字符集与代码中运用的函数不相同等、定义的字符串变量分歧盟,将会孳生编写翻译错误只怕运路程序显示乱码,以至大概引起程序运营错误,那或多或少内需引起注意。

WINAPI 为宏定义

2.4.2    Unicode与ASGII的转换

Windows 特地提供了多少个 API
来落实对字符编码的转变职业。ideCharToMultiByte、MultiByteToWideChar、UnicodeToBytes
函数可以产生那一个干活儿。

WideCharToMultiByte 函数将 Unicode 字符串转变为多字节字符串,以适应 A
版本的API,MultiByteToWideChar 函数将多字节字符串转变为了 Unicode
字符串,以适应 W 版本的 API 的参数情势要求。

#define WINAPI
__stdcall,表示函数调用方式,一时能够不理睬,不影响代码编写,只供给精晓MessageBox()再次来到值为
int,表示按下的按钮。

2.4.3    对Windows程序设计标准的提出

各样技师都有自个儿的典型化编制程序习贯。代码的行业内部不是本书的基本点,所以这里只交付一些微软经常接纳代码标准,MSDN
的演示中,SDK 的头文件和例子中大致都以应用的这种办法。

变量名:经常接纳所谓的“匈牙利(Hungary卡塔 尔(英语:State of Qatar)命名法”,变量名由“类型缩写(小写卡塔尔国”+“变量描述(单词首字母大写卡塔 尔(英语:State of Qatar)”构成,如字符串类型的变量能够命名字为szFileName,DWO中华VD 类型的多少能够命名叫 dwFileSize,指针类型可以命名叫lpBuffer,句柄类型的变量可以命名称为 hLogFile 等。

函数名:各单词的首字母大写,如 EnumerateFilesInDrectory、ShowFileSize
等。

类型名:全大写,各单词以下划线分隔,如 WIN32_FILE_
ATTRIBUTE_DATA、DWORD、 HANDLE 等。

常量:同类型名的命名形式。

宏:多与项目名命名格局相近,有的也与函数名命名情势同样。
大括号与代码段:平日大括号独立占黄金年代行,大括号内的代码段缩进。要是代码段仅黄金时代行(如
if-else 后的语句卡塔尔,也建议使用大括号。

在调用或概念函数时,如果函数太长,能够分行写,将每一个参数写风流浪漫行。日常多于
3个参数的函数需求分行写,以精彩和便利阅读为尺度。

在本书的亲自过问中,都将尽可能采取这么些标准化的秘籍。

 

参数表达

2.5    小结

PDF下载:

摘自:《精通Windows.API-函数、接口、编制程序实例》 人民邮电出版社

范文庆、周彬彬、安靖写作

 

hWnd:该新闻框的父窗口句柄,假如此参数为NULL,则该新闻框未有兼具父窗口。咱们不用急于明白这一个参数,后续会详细批注。

lpText:音信框的剧情。LPCTSTTiggo 是自定义数据类型,等价于 const char *。

lpCaption:音信框的标题。

uType:对话框的开关样式和Logo。

uType 扶持的开关样式:

图片 9

这一个按键都以宏定义

#define MB_OK 0x00000000L

#define MB_OKCANCEL 0x00000001L

#define MB_ABORTRETRYIGNORE 0x00000002L

#define MB_YESNOCANCEL 0x00000003L

#define MB_YESNO 0x00000004L

#define MB_RETRYCANCEL 0x00000005L

您也得以品尝用数字来表示开关,举例:

MessageBox(NULL, TEXT(“你好,款待源世界你!”), TEXT, 1);

也会生成与地点同样的对话框。

除却按键,uType 还协理Logo(Logo对客户有提示作用卡塔尔:

图片 10

这么些Logo也都以宏定义:

#define MB_ICONHAND 0x00000010L

#define MB_ICONQUESTION 0x00000020L

#define MB_ICONEXCLAMATION 0x00000030L

#define MB_ICONASTERISK 0x00000040L

倘若指望同一时候定义按键和Logo的体裁,能够利用或运算|,譬喻:

MessageBox(

NULL,

TEXT,

TEXT,

MB_OKCANCEL | MB_ICONINFORMATION

);

把地点的Message博克斯换来那几个就ok了。运营结果

与地点的对话框相比较,多出了叁个Logo,同期仍然是能够听见提醒音。是否多了三个提醒标识在文字的前方啊。

再看来一下MessageBox() 的重临值。

MessageBox()
再次来到被按下的开关,以数字代表,这么些数字都被定义成了宏,如下所示:

图片 11

相应的宏定义为:

#define IDOK 1

#define IDCANCEL 2

#define IDABORT 3

#define IDRETRY 4

#define IDIGNORE 5

#define IDYES 6

#define IDNO 7

图片 12

小编推荐叁个学C语言/C++的求学裙【 七三零,风流倜傥三零,二二后生可畏】,无论你是大拿仍然小白,是想转行还是想入行都足以来询问一齐发展一同读书!裙内有开辟工具,超多干货和才具资料分享!

总结:

对Yu Gang刚学完C语言的,学windows编制程序的,这几个都以满满的干货,必供给记住喔。从你学windows编制程序发轫,你就早就离别了掉价的windows
do分界面,只要一步一步走,写一个绝妙的window程序不言而谕。这么些都以事后学习总得驾驭的,先收藏吧!

这些是C/C++能做的

服务器开垦技术员、人工智能、云计算程序员、音讯安全、大数据
、数据平台、嵌入式技术员、流媒体服务器、数据控解、图像管理、音频录像开垦技术员、游戏服务器、布满式系统、游戏帮忙等

图片 13图片 14图片 15

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图