Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译
入门指南
本教程是关于什么的
本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法)。使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何可以连接API的语言,包括Java、Assembly和Visual Basic;我不会向你呈现任何跟这些语言相关的代码,这需要你在本教程的指导下自己去完成,有一些人在本API的基础上使用其他语言进行编程取得了相当的成功。
本教程不会教你C语言,也不会告诉你怎样去运行你特定的编译器(Borland C++,Visual C++,LCC-Win32等)然而我将花一些时间在附录中提供一些使用编译器的知识的笔记。
如果你不知道宏或类型定义是什么或者一个开关语句时如何工作的,那么现在回头,先找一本关于C语言的好书或教程好好研究学习。
注意事项
在整个教程中,有时我会确切地指出某些很重要的地方,这些地方的内容需要你好好研读。因为这些地方让很多人搞砸了,如果你没有好好研读的话,那你也很可能搞砸。
第一个地方是:
在ZIP压缩文件中提供的代码是必看的!我没有在教程中提供所有的代码,只包含与我正在讨论部分相关的代码,为了了解这段代码如何嵌入程序中,你必须看一看在ZIP文件中的源码。
第二个方面是:
完整地看完所有的内容!如果你在本教程的某个小节中产生疑问,请保持耐心阅读,你的疑问可能会在接下来的内容中被解决。如果你无法忍受带着疑问阅读,那么在向我发来邮件之前,至少浏览和搜索文档中的剩余内容。
还有一件事情需要记住的是,你关于主题A的一些疑问可能会在对B或C甚至L的讨论中被回答,所以遇到问题时多读读文档寻找答案。
OK,上面就是一些在教程正式开始之前需要说明白的东西和注意事项,现在让我们来尝试一些实际的代码。
最简单的Win32程序
如果你是一个彻彻底底的菜鸟,那么请保证至少你能编译这个最基本的窗口应用。把一下的代码复制到你的编译器中,如果没出现什么问题,你应该会看到一个最简单的窗口。
记住把代码当成C编译,而不是C++,这可能没什么关系,但因为这里所有的代码都是C的代码,我们应该有个合理正确的开始。在大多数情况下,你应该把你的代码加入到.c文件中而不是.cpp文件中,如果你感觉很蛋疼,把代码放到test.c文件中然后编译它就完了。
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
return ;
}
如果代码无法正常运行,先看看都有哪些报错然后把它解决,如果你不明白报错的内容,请查阅适用于你的编译器的帮助或任何其他文档。确保你新建一个Win32 GUI项目(不是控制台应用程序),不管你用的是什么编译器,关于这一块,很遗憾我无法提供更多帮助,因为不同编译器的标准是不一样的。
你可能得到了一些警告,告诉你没有使用适用于WinMain()的参数,这没关系,能编译通过就好。现在我们已经建立了一个可以通过编译的最简单的程序,让我们对这段代码做进一步的讲解。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
WinMain()相当于DOS或UNIX程序的main(),这是你的程序开始执行的地方,参数列表如下:
HINSTANCE hInstance
程序可执行模块(在内存中的可执行文件)的句柄
官方API(处理程序的可执行模块) 一般用来加载资源和执行其他任务的基础模块(加载到你程序中的exe或dll模块) dll: dynamic link library
(PS.关于句柄:句柄(handle)是一种资源的标识; 操作系统要管理这些资源,都是通过句柄来找到对应的资源。 句柄有点类似于指针, 资源都会占用一定的内存,当我们需要使用这些资源的时候,就需要获得这些内存中的资源,通过句柄就可以访问这些内存。
按资源的类型,可以将句柄细分成 图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE))
HINSTANCE hPrevInstance
对于win32程序来说通常是NULL,对win16程序有用,对win32无用
LPSTR lpCmdLine
一个字符串的命令行参数,不包括程序名,跟打开文件的路径有关,默认为空
int nCmdShow
一个可能会传递给ShowWindow()方法的一个整数值,在接下来的内容中我们会讲到
hInstance用于加载资源和其他基于单个窗口模块的任务,这里所有的模块是加载进你的程序中的EXE或DLL,对本教程中的大部分内容来说,我们只需要关注一个模块,那就是EXE。
hPrevInstance只用在Win16程序中,作为程序实例化之前的一个预处理的句柄,在Win32中不再使用这个参数,在这里你可以忽略它。
调用的惯例
WINAPI指定了参数调用的惯例,这个惯例被定义为_stdcall的标准。如果你不知道这是什么意思,不用担心,这对我们接下来的教程没有什么影响,你只需要知道在这里需要这样指定。
Win32的数据类型
你会发现很多通用的关键字或类型在win32中有指定的定义,在win32中,我们用UINT来表示unsigned int,用LPSTR来表示char*等。。。要选择哪种表达方式取决于你,如果你感觉使用char*比用LPSTR更舒服,那就用char*吧!你只需要确保替换之前明白是哪种类型
记住一些特定的定义,它很容易被解释说明!一个LP的前缀代表Long Pointer,在Win32中Long是被废弃的所以我们无需担心指针加不加Long的问题,但如果你连指针都不懂,你可以选择:1)找本C的书或教程看看 2)继续看本教程,接着一脸懵逼吧。我建议不懂的人选择1,但大多数不懂的人选择2,接下来的东西没看懂的话别怪我没提醒你。
接着在LP后面的C表示这是个常量指针,所以LPCSTR表示一个指向常量字符串的指针,它不可改变;以此类推LPSTR表示一个非常量指针,它是可改变的。
你可能会看到一个T混杂在里面,我们现在不需要关心这个,除非你是使用Unicode编码,否则T不代表什么。
之所以想把它翻译过来是因为这个教程很好,而网上又没有找到对应的翻译,由于本人英文水平所限,只能翻译到这个程度了,有纰漏还望多多指出,附上本篇翻译的英文原版教程地址:http://www.winprog.org/tutorial/start.html
Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译的更多相关文章
- Win32编程API 基础篇 -- 4.消息循环
消息循环 理解消息循环 为了编写任何即使是最简单的程序,了解windows程序的消息循环和整个消息发送结构是非常有必要的.既然我们已经尝试了一点消息处理的东西,我们应该对整个程序有更深入的理解,如果你 ...
- Win32编程API 基础篇 -- 3.消息处理 根据英文教程翻译
消息处理 例子:窗口点击 好的,现在我们已经得到一个窗口了,但我们什么也做不了除了DefWindowProc()允许窗口大小被调整,最大最小化等...这不是很激动人心啊 在接下来的一小节中我将向你展示 ...
- Win32编程API 基础篇 -- 6.菜单和图标
菜单和按钮 例子:菜单1 本小节仅仅向你展示如果向你的窗口中加入一个基本的菜单,通常你会用到一个提前制作好的菜单资源,这会是一份.rc文件并且会被编译链接进你的.exe可执行程序中.这是具体的流程做法 ...
- Win32编程API 基础篇 -- 5.使用资源
使用资源 你可能想参考教程结尾的附近,为了获得跟VC++和BC++资源相关的信息. 在我们讲得更加深入之前,我将大致讲解一下资源的主题,这样在每个小节中我就不必再去重讲一遍了.在这一小节中,你不需要编 ...
- Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译
一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...
- ASP.NET Web API 基础篇1
ASP.NET Web API 直到我膝盖中了一箭[1]基础篇 无题 蓦然回首,那些年,我竟然一直很二. 小时候,读武侠小说的时候,看到那些猪脚,常常会产生一种代入感,幻想自己也会遭遇某种奇遇,遇到悬 ...
- 我拖拖拖--H5拖放API基础篇
不要搞错,本文不是讲如何拖地的.看过<javascript精粹>朋友应该知道,他实现拖放的过程比较复杂,现在时代不同了,我们用H5的新的拖放API就能非常方便的实现拖放效果了.最近在园子见 ...
- (转)Android高性能编程(1)--基础篇
关于专题 本专题将深入研究Android的高性能编程方面,其中涉及到的内容会有Android内存优化,算法优化,Android的界面优化,Android指令级优化,以及Android应用内存占 ...
- 【TCP/IP】之Java socket编程API基础
Socket是Java网络编程的基础,深入学习socket对于了解tcp/ip网络通信协议很有帮助, 此文讲解Socket的基础编程.Socket用法:①.主要用在进程间,网络间通信. 文章目录如下: ...
随机推荐
- 网络连接详细信息出现两个自动配置ipv4地址的解决办法
问题描述:网络连接详细信息出现两个自动配置ipv4地址,一个是有效地址,一个是无效地址. 解决办法: 先将本地连接ip设置成自动获取 点击开始——>运行——>输入cmd,回车,进入命令行界 ...
- mysql的子查询的提高
统计胜负结果的sql语句 date result 2011-02-01 胜 2011-02-01 负 2011-02-0 ...
- set && muliset
#include <set> #include <iostream> #include <cstdio> #include <cctype> using ...
- 汇编程序52:实验15 安装新的int9中断例程
assume cs:code ;重写int9中断例程,当按住a后松开,便会产生满屏A stack segment dw dup() stack ends code segment start: mov ...
- 二分搜索 Codeforces Round #218 (Div. 2) C. Hamburgers
题目传送门 /* 题意:一个汉堡制作由字符串得出,自己有一些原材料,还有钱可以去商店购买原材料,问最多能做几个汉堡 二分:二分汉堡个数,判断此时所花费的钱是否在规定以内 */ #include < ...
- 题解报告:hdu 1010 Tempter of the Bone
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 Problem Description The doggie found a bone in a ...
- 6.12---Swagger中paramType---swagger的RequestParam和ApiImpliciParam----Example中方法带有selective
paramType:表示参数放在哪个地方 header-->请求参数的获取:@RequestHeader(代码中接收注解) query-->请求参数的获取:@RequestPa ...
- phpcms标签第三弹
{CHARSET} -------------------------------------字符集 (gbk或者utf-8) {if isset($SEO['title']) && ...
- jdbcTemplate传参使用Map或List
List传参方式 举个例子 sql = "select * from table where id=? and param=?": sql中的参数要用?形式,然后使用list.ad ...
- 2n皇后 - 回溯
题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...