1 对WinMain的理解

就像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"),0);
    return 0;
}

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

对整个程序的分析

(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程序设计》第五版。

时间: 2024-10-28 16:01:46

1 对WinMain的理解的相关文章

从WinMain开始

一.抽象渗漏法则 根据Joel的抽象渗漏法则,所有重大的抽象机制在某种程度上都是有漏洞的.Joel举过一个例子: C++字符串类型应该能让你假装字符串是个基本类型,它们尝试“字串很难处理”这个事实抽象掉,让它使用上象整型一样容易,几乎所有C++字串类型都会重载加号运算符,才能把字串连接写成s + "bar".不过你知道吗?不管怎么努力,世上还是没有C++字串类型能让你写成 "foo"+"bar",因为C++里的字串常数一定是char *,绝对不会

再理解Windows程序内部运行机制

参照孙鑫<VC++深入详解> 创建Win32程序的步骤: 1. 编写WinMain函数 2. 设计窗口类(WNDCLASS) 3. 注册窗口类 4. 创建窗口 5. 显示并更新窗口(ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);) 6. 消息循环(不断地从消息队列中取出消息,并进行响应) 7. 窗口过程函数(处理发送给窗口的消息) 测试代码如下(在VS2010编译通过): #include <stdafx.h> #include

Windows核心编程02-记事本写代码深入理解cl.exe和link.exe

接下来用记事本手写代码: 1,建一个空的记事本,敲入以下代码 #include "windows.h" int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int cmdShow) { MessageBox(NULL,"HelloWorld!","Info",MB_ABORTRETRYIGNORE|MB_ICONINFORMATION); return

深入理解Windows X64调试

随着64位操作系统的普及,都开始大力进军x64,X64下的调试机制也发生了改变,与x86相比,添加了许多自己的新特性,之前学习了Windows x64的调试机制,这里本着“拿来主义”的原则与大家分享. 本文属于译文,英文原文链接:http://www.codemachine.com/article_x64deepdive.html 翻译原文地址:深入Windows X64 调试 在正式开始这篇译文之前,译者先定义下面两个关于栈帧的翻译: frame pointer:栈帧寄存器.栈帧指针,在X86

WinAPI WinMain, CreateMutex, ShellExecute三个函数

WinMain函数是提供给用户的Windows应用程序入口点,其原型如下: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ipCmdLine, int nCmdShow); 函数有四个参数: hInstancd: 是当前应用长须实例的Handle. hPrevInstance: 是应用程序上一个实例的Handle.(MSDN:如果你想要知道程序是否有另一个实例,建议使用Mutex来实现,用Mutex可

PacMan开发-Win32的&quot;HelloWorld&quot;&amp;WinMain()函数

VS2013写出的第一个win32程序-Hello World. 通过这个程序: · 熟悉如何在MFC下创建一个窗口 · 了解windows程序的运行机制. 咳咳,说的严肃了,最近我们宿舍正在进行用Visual C++编写一个小游戏. 我们使用的运行平台是Visual Stdio 2013. 本以为写一个Hello World会像C++那样简单,可是,在初步了解了windows程序的运行机制后,如何创建一个窗体就成了我们之间的难题. // Demo.cpp : 定义应用程序的入口点. // #i

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

一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序就可以了,微软帮我们做了非常好的封装,以至于对于很多.NET开发人员至今也不清楚Windows 平台下程序运行的内部机制,所以本专题将深入剖析下Windows 程序的内部运行机制. 二.Windows平台下几个基础概念 有朋友会问,理解了程序运行的内部机制有什么用,因为在我们实际开发中用得微软提供的

理解Windows消息循环机制

理解消息循环和整个消息传送机制对Windows编程十分重要.如果对消息处理的整个过程不了解,在windows编程中会遇到很多令人困惑的地方. 什么是消息(Message)每个消息是一个整型数值,如果查看头文件(查看头文件了解API是一个非常好的习惯和普遍的做法)可以发现如下一些宏定义: #define WM_INITDIALOG                   0x0110 #define WM_COMMAND                      0x0111 #define WM_L

MFC中如何改装SDK的WinMain函数

1.在TCHAR.H文件中定义了一个宏:#define _tWinMain WinMain这样MFC源代码在编译的时候,_tWinMain就会被替换为WinMain(),这样操作系统就可以调用了. 2.在APPMODUL.CPP文件中,定义了_tWinMain(),在_tWinMain()中 return AfxWinMain(); 1 extern "C" int WINAPI 2 _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInsta