《windows核心编程》(一)-----------2013.7.25
一、概念
Windows编程基础
•Windows应用程序的类型
–控制台程序 Console
DOS程序,本身没有窗口,通过Windows DOS窗口执行
–窗口程序
拥有自己的窗口,可以与用户交互
–库程序
存放代码、数据的程序,执行文件可以从中取出代码执行和获取数据
-静态库程序
扩展名LIB,在编译链接程序时,将代码放入到执行文件中
-动态库程序
扩展名DLL,在执行文件执行时从中获取代码
•三种应用程序的对比
-入口函数
控制台程序 - main
窗口程序 - WinMain
动态库程序 - DllMain
静态库程序 - 无入口函数
(不是所有有Main函数的程序都可以执行)
-文件存在方式
控制台程序、窗口程序 - EXE文件
动态库程序 - DLL文件
静态库程序 - LIB文件
-执行方式
控制台程序 - 在DOS窗口内执行。
窗口程序 - 拥有自己的窗口的执行文件
动态库程序 - 本身无法执行,由可执行程序或其他的DLL调用(动态)
静态库程序 - 执行是不存在,代码会嵌入到可执行文件或DLL等中。
Windows开发环境
Windows开发环境
•Windows开发工具和库
– 开发工具 Visual Studio C++
VC1.5 - VC6.0 – VC2005-VC2010( 10.0 )
– VC的编译工具
编译器CL.EXE 将源代码编译成目标代码
链接器LINK.EXE 将目标代码、库链接生成最终文件
资源编译器RC.EXE 将资源编译,最终通过链接器存入最终文件
VC编译器编译链接流程:
CL.EXE LINK.EXE
.c/.cpp-------------->.obj-------------->.exe/.dll/.lib
VC编译器编译链接流程:
CL.EXE LINK.EXE
.c/.cpp-------------->.obj-------------->.exe/.dll/.lib
– Windows库和头文件
-Windows库
kernel32.dll - 提供了核心的API,例如进程、线程、内存管理等。
(核心,函数最少)
user32.dll - 提供了窗口、消息等API
(函数最多)
gdi32.dll - 绘图相关的API
(专门处理绘图)
-头文件
Windows.h - 所有windows头文件的集合
windef.h - windows数据类型
(微软自己的一套数据类型)
winbase.h - kernel32的API
wingdi.h - gdi32的API
winuser.h - user32的API
winnt.h - UNICODE字符集支持
Hello World 程序的相关函数
编译、链接和执行
二、当天程序代码及运行结果
源代码 Hello.c
运行结果与分析图
Hello World 程序的相关函数
int WINAPI WinMain(
HINSTANCE hInstance,//当前程序的实例句柄
HINSTANCE hPrevInstance, //当前程序前一个实例句柄(已不常使用,为了兼容以前的函数所有才保留)
LPSTR lpCmdLine,//命令行参数字符串
int nCmdShow //窗口的显示方式
);
hPrevInstance - Win32下,一般为NULL
int MessageBox(
HWND hWnd,//父窗口句柄
LPCTSTR lpText, //显示在消息框中的文字
LPCTSTR lpCaption, //显示在标题栏中的文字
UINT uType //消息框中的按钮、图标显示类型(按钮与图标的参数使用"|"(位与)链接)
编译、链接和执行
•编译环境准备
VC98\BIN\VCVARS32.BAT
•编译程序 - CL
CL.EXE -? 显示CL的帮助
/c 只编译不链接
/Tc 编译C文件
/Tp 编译C++文件
/I 头文件路径
•链接程序 - LINK
LINK.EXE xxx.obj xxx.lib
•执行
二、当天程序代码及运行结果
源代码 Hello.c
#include<windows.h>
int WinMain( HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
MessageBox( NULL,//没有父窗口
"Hello!",
"Information",
MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION);
}
运行结果与分析图
将显示在消息框的文字的参数换成命令行参数字符串
#include<windows.h>
int WinMain( HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
MessageBox( NULL,//没有父窗口
lpCmdLine,
"Information",
MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION);
}
运行结果
三、问题
1.WinMain()函数中参数lpCmdLine是什么;
Pointer to a null-terminated string specifying the command line for the application, excluding the program name. To retrieve the entire command line, use the GetCommandLine function.(MSDN中的参数解释)
当程序开始运行时 获取用户输入的命令指令基于命令行的程序 win32 console application 用户调用你的程序的时候,可以传递参数。
2.为什么MessageBox()函数中的消息框参数换成WinMain()函数中参数lpCmdLine可以得到目标文件的路径;
3.使用命令行链接程序时为什么用目标文件和user32.lib库文件进行链接而不是与user32.dll动态链接库进行链接。