就像C语言的main是它的程序路口一样,windows的程序入口是WinMain,WinMain的定义可以查看winbase.h文件。

Hello Windows(c语言中的Hello world!)

#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){
MessageBox(NULL,TEXT("Hello windows"),TEXT("HelloMSG"),);
return ;
}

效果为显示一个弹框,效果如下:

对整个程序的分析

(1)#include <Windows.h>

  犹如c中的#include <stdio.h>一样,在这里#include <Windows.h>也是预处理指令,Windows.h是最重要的包含文件,它囊括了若干个其它Windows头文件,以下为最重要也是最基本的头文件:

  • windef.h 基本数据类型定义
  • winnt.h 支持Unicode的类型定义
  • winbase.h 内核函数
  • winuser.h 用户界面函数
  • wingdi.h 图形设备接口函数

(2)WINAPI

  WINAPI的定义为__stdcall,__stdcall是一种函数调用规则:

  • 进行函数调用,函数参数的入栈方式是最右边先入栈
  • 被调用的函数负责栈的回收(调用者只负责压栈)。

  当然这种函数调用规则还有别的,比如__cdecl、__pascal等规则。只是绝大多数Windows函数调用都定义成WINAPI。

(3)WINAPI

  ①:第一个参数 HINSTANCE hInstance

    HINSTANCE为实例句柄,句柄无非是一个数值,程序用它来标识某些东西。在此该句柄唯一标识我们这个程序。

  ②:第二个参数 HINSTANCE hPrevInstance

    前一个实例句柄,在win32程序中这一概念已不再采用,因此WinMain的第二个参数通常是NULL。

  ③:第三个参数 PSTR szCmdLine

    PSTR是一个字符指针,用来运行程序的命令行,有些程序在启动时用它来把文件装入内存。

  ④:第四个参数 int iCmdShow

    用来指明程序最初如何显示:正常显示、最大化到全屏、最小化到任务栏。

  网上有一位网友举了一个特别通俗易懂的列子来理解这些参数,在此引荐过来:

    双击QQ快捷方式, 会启动一个qq程序, 假设给它个编号9527;
    再双击QQ快捷方式, 又启动了一个新的qq, 假设编号9528;
    对于9528来说, hInstance=9528, hPrevInstance=9527;
    不过, msdn说hPrevInstance的这个判断没效果, hPrevInstance实际上是无意义的。     iCmdShow表示窗口的初始状态, 最大化, 最小化, 隐藏, 还是一般大小的显示等等。
   szCmdLine是命令行参数, 在windows的命令行工具cmd中启动程序的话,
    有时能带上其它参数, 比如"ping www.qq.com -t",这个命令就带了很多参数, 用空格分开了, 分别是 ping www.qq.com -t。

  原文参考地址为:点击查看原文

 本文作为自己学习中的笔记与大家分享,主要摘自《Windows程序设计》第五版。

1 对WinMain的理解的更多相关文章

  1. 对WinMain程序入口函数返回值为msg.wParam的几点理解

    原文地址:http://blog.csdn.net/setflvet/article/details/6983224 1.在WinMain主函数中,最后的返回值是msg.wParam,这个参数是传递给 ...

  2. Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

  3. 深入理解 Win32 PE 文件格式

    深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什 ...

  4. 深入理解Windows X64调试

    随着64位操作系统的普及,都开始大力进军x64,X64下的调试机制也发生了改变,与x86相比,添加了许多自己的新特性,之前学习了Windows x64的调试机制,这里本着“拿来主义”的原则与大家分享. ...

  5. <MFC_1>深入剖析MFC的WinMain和消息机制

    一.开篇引论 熟悉Win32开发的朋友,应该非常了解它的基本组成和流程 1. WinMain:书写窗口类(WNDCLASS) -> 注册窗口类 -> 创建窗口 -> 显示窗口和更新窗 ...

  6. Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)

    Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...

  7. 从WinMain开始

    一.抽象渗漏法则 根据Joel的抽象渗漏法则,所有重大的抽象机制在某种程度上都是有漏洞的.Joel举过一个例子: C++字符串类型应该能让你假装字符串是个基本类型,它们尝试“字串很难处理”这个事实抽象 ...

  8. WinMain函数详解(转载再编辑)

    在Windows应用程序中,我们可以认为 WinMain() 函数是程序的入口,WinMain()的原型如下: int WINAPI WinMain( HINSTANCE hInstance, HIN ...

  9. vs LNK2019 无法解析的外部符号 ***,该符号在函数 WinMain 中被引用

    一般链接错误都是因为包含头文件与lib库不匹配(无导出函数.lib库的release debug版本混乱.库引用的优先级.编译器设置mt/mtd等等)造成的. 错误    LNK2019    无法解 ...

随机推荐

  1. Orchard官方文档

    开始使用 安装Orchard 通过Orchard zip文件安装 使用WebMatrix开发Orchard Dashboard总览 创建你的第一个Orchard站点 导航和菜单 添加博客 新增管理媒体 ...

  2. 数据结构复习:希尔排序的C++实现

    1.原理介绍 希尔排序又称为缩小增量排序,由D.L.Shell在1959年提出而得名. 该算法先取一个小于数据表中元素个数 n 的整数gap, 并以此作为第一个间隔,将数据分为gap个子序列,所有距离 ...

  3. Redis缓存服务搭建及实现数据读写

    发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如Memcached.Redis.mongodb等,今天得空抽时间把Redis缓存研究了一下,写下来总结一下,跟大家一起分享 一下.由于小弟水 ...

  4. 在asp.net mvc中将checkbox传到后台时总是true的解决方法

    我今天在做同城交友网站(www.niyeuwo.com)时发现,不管checkbox是否选 中,传到Controller时总是true,后来在查网上查了资料才知道,原来是jQuery在传值时写错了. ...

  5. linux中mail函数不能发送邮件怎么办

    原因分析: 1.检查下本机25端口是否有开放 2.mail是利用linux自带的sendmail服务来发送邮件的,service sendmail status 查看下该服务的状态 发送命令:mail ...

  6. Linux 命令 alternatives和update-alternatives

    参考: http://lionbule.iteye.com/blog/717722 http://manpages.ubuntu.com/manpages/oneiric/man8/update-al ...

  7. Load Balancing 折半枚举大法好啊

    Load Balancing 给出每个学生的学分.   将学生按学分分成四组,使得sigma (sumi-n/4)最小.         算法:   折半枚举 #include <iostrea ...

  8. 1.6.4 Uploading Structured Data Store Data with the Data Import Handler

    1.使用DIH上传结构化数据 许多搜索应用索引结构化数据,如关系型数据库.DIH提供了一个这样的存储并索引结构化数据的机制.除了关系型数据库,solr可以索引来自HTTP的内容,基于数据源如RSS和A ...

  9. 1.4.2 solr字段类型--(1.4.2.6)使用外部文件和程序

    1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...

  10. 升级树莓派archlinux系统到新sd卡

    由于之前把树莓派系统安装在4gb的sd卡上,随着系统的更新及安装了一大堆软件包之后,系统提示空间不足了.网上搜索了下,把所有数据迁移到新的sd卡上还是比较简单的. 克隆sd卡: 1,关闭树莓派电源,取 ...