2013.7.25 学习笔记《windows核心编程》(一) Windows编程基础

来源:互联网 发布:免费阅读天庭淘宝城 编辑:程序博客网 时间:2024/05/20 12:49

《windows核心编程》(一)-----------2013.7.25

一、概念

Windows编程基础


•Windows应用程序的类型

–控制台程序 Console
           DOS程序,本身没有窗口,通过Windows DOS窗口执行
–窗口程序
           拥有自己的窗口,可以与用户交互
–库程序
           存放代码、数据的程序,执行文件可以从中取出代码执行和获取数据
-静态库程序
          扩展名LIB,在编译链接程序时,将代码放入到执行文件中
-动态库程序
           扩展名DLL,在执行文件执行时从中获取代码


•三种应用程序的对比
 -入口函数
           控制台程序 - main
           窗口程序 - WinMain
           动态库程序 - DllMain
           静态库程序 - 无入口函数
(不是所有有Main函数的程序都可以执行)
-文件存在方式
           控制台程序、窗口程序 - EXE文件
           动态库程序 - DLL文件
           静态库程序 - LIB文件
-执行方式
           控制台程序 - 在DOS窗口内执行。
           窗口程序 - 拥有自己的窗口的执行文件
           动态库程序 - 本身无法执行,由可执行程序或其他的DLL调用(动态)
           静态库程序 - 执行是不存在,代码会嵌入到可执行文件或DLL等中。

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
– 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 程序的相关函数

int WINAPI WinMain(        HINSTANCE hInstance,//当前程序的实例句柄HINSTANCE hPrevInstance, //当前程序前一个实例句柄(已不常使用,为了兼容以前的函数所有才保留)LPSTR lpCmdLine,//命令行参数字符串int nCmdShow //窗口的显示方式);hPrevInstance - Win32下,一般为NULLint 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,LPSTRlpCmdLine,intnCmdShow){MessageBox(NULL,//没有父窗口"Hello!","Information",MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION);}

运行结果与分析图



将显示在消息框的文字的参数换成命令行参数字符串

#include<windows.h>int WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTRlpCmdLine,intnCmdShow){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动态链接库进行链接。

原创粉丝点击