共有回帖数 0 个
- 翻译<<theForger\'s Win32 API Programming Tutorial>>
-
取消只看楼主
收藏
回复
-
原文地址: http://www.winprog.org/tutorial/index.html
今天是第一章, 俺就不客套, 也不谦虚了, 哪翻译的有毛病,
上路
这份教程是关于什么的?
这份教程打算教给您使用Win32 API编程的基础知识.
所使用的语言为C,大多数C++编译器都可以很好的编译本教程中的代码.
事实上,教程中的大部分内容都适用于支持Win32 API的语言,包括Java,汇编和VB.
以前也有人使用这些语言取得了很大的成功.
不过我在这里不会使用它们,您有兴趣可以自己研究.
这份教程不是关于C语言的教程,也不是关于某种编译器的教程(BC,VC,LCC等等...),
但是我会在附录中附录一些我的经验,一些我所熟悉的编译器的使用经验.
如果您连宏或者typedef都不晓得,请去找本好书,啃啃C语言.
*重点提示:
贯穿本文,我会在某些地方指出一些需要特别注意的地方,因为这些地方让很多人郁闷非常,
如果你不注意这些地方,也将非常郁闷.
第一个重点是:
本文配套的示例代码(ZIP文件)不是可选的! 我不会在教程中给出所有代码.
文中只会给出与当前讨论相关的代码,想要彻底理解这些代码是如何运作的,
您有必要阅读完整的示例代码~
第二个重点是:
完整的阅读本教程! 如果您在某节遇到了一个不容易的理解的问题,那么请耐心些,
答案不久将在后文中出现.
如果答案没有很快的出现,那么请您在上网求助前至少搜索一下本教程的剩余部分.
另外有些问题可能产生于主题A,而答案可能在主题B或C或L中,
这时您要做的是稍微联系一下上下文.(So just look around a littl)
哦了~~~我要吼的都吼完了~~吼累了就来看一些实际的代码~
最简单的Win32程序
如果您是个彻头彻尾的无敌菜鸟,那么首先要保证您能够编译最基础的windows应用程序.
将下面的代码敲入您的编译器,如果一切OK,恭喜您荣升为一名菜鸟程序员.(鸟注....)
(Slap the following code into your compiler and if all goes well you should get one of the lamest programs ever written)
注意,请将下面的代码当作C语言编译,而不是C++.
您也许认为这无关紧要~但是上面说了,本文的代码全部为C语言,因此我们有必要规范一下~
大多数情况下,这意味着您的源文件后缀应该为.c而不是.cpp
(鸟注: 后面一句没翻译,无法了解作者逻辑- -!
If all of this hurts your head,just call the file test.c and be done with it)
#include windows.h
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Goodbye,cruel world!", "Note", MB_OK);
return 0;
}
如果上面的代码编译失败,首先检查错误信息,如果您不明白这些信息的意思,请在配套的编译器文档中寻找.
注意! 确定你选择的是Win32 GUI工程/makefile/目标文件,而不是Console.
关于错误信息与工程类型,我能说的就这么多了,不同的编译器,不同的用户能够产生不同的错误,变数太多拉~~~
某些编译器可能给出并没有使用全部的WinMain函数参数的警告,这不要紧,可以无视之.
好啦,我相信您现在已经能够编译程序了,那么就来研究代码了...
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
在windows GUI程序中,WinMain()函数相当于DOS或UNIX中的main函数,一个windows GUI程序将从这里开始运行.
参数如下:
HINSTANCE hInstance: 可执行模块句柄.
HINSTANCE hPrevInstance: 在Win32程序中永远为NULL.
LPSTR lpCmdLine: 指向命令行参数(一个单行字符串),不包括程序名.(鸟注: 这里有个不是问题的问题,
作者说不包括程序名,实际上是包括的,只不过lpCmndLine跳过了程序名,直接指向后面的参数)
int nCmdShow: 一个整数,用来作为ShowWindow()的参数,后面会接触到.
加载某些资源或者执行基于模块的任务时要用到hInstance. 一个模块不是加载到程序中的EXE就是DLL.
对于本教程的大部分内容,我们只关心EXE模块~
在Win16中hPrevInstance用于指出上一个可执行模块实例(如果存在的话),而Win32不再需要它了,永远为NULL.
调用规则
WINAPI指示被修饰函数的调用规则,它被定义为_stdcall,如果您不明白这是什么意思,没关系滴,
它不会影响您学习本教程,您只要记住它在这里是必须的就好了.
Win32数据类型
不久您会发现,许多C中的标准关键字或数据类型,在windows都有其特殊定义.
UINT对应unsigned int,LPSTR对应char* 等等.....具体用哪种,就看您的爱好了.
如果您更喜欢char*而不是LPSTR,大可使用前者. 只是在您替换之前需要确定被替换的是什么数据类型.
记住一些简单的规则有助于您理解windows版本的数据类型.
例如LP前缀代表Long Pointer(长指针),在Win32中指针不分长短,所以Long可以被无视掉老~
呃.......如果您连指针是什么玩意都不晓得,那么有2种选择:
1. 找本C语言教程,补基础去~
2. 死挺硬抗,继续往下看.....
我建议您选择1,但是我想很多人都会选择2:),这样可别怪我没提醒你.....
LP后面的C(LPC)代表const pointer(鸟注: 作者是说a pointer points to a const type,
也就是指向常量的指针,并不是说这个指针是个常量指针...).
LPCSTR就是一个指向常量字符串的指针,您不能也不应该修改指向的对象. 而LPSTR就可以拉.
另外在windows版本的字符串类型中,您也许在其中发现字母"T",现在不必关心它拉,
除非您在与Unicode打交道,否则它没有任何意义.
If all of this hurts your head,just call the file test.c and be done with it
这句的意思是如果(上面这些什么 .c 后缀和 .cpp 后缀之类的东西)看的你头疼,直接把文件叫做 test.c 就好了��
楼主 2016-01-15 17:22 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知