略加增添与修改! 工具:VC++6.0       系统:win7 64位


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

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
);
  • hInstance  前面说过,资源存在于内存之后,那么一个每个程序运行之后,也被看做一个资源,它有一个属于自己的句柄,这个句柄就保存在变量 hInstance 中。
  • hPreInstance  表示当前实例的前一个实例的句柄,在Win32环境下,参数总是为NULL。也就是说,在Win32环境下这个参数不再起作用!!
  • lpCmdLine  用于存放传递给应用程序的参数,那么如何给应用程序传递参数?这里举几个例子:

1) 通过命令行传递参数:在命令行下输入 notepad hi.txt,这里hi.txt这个文件的路径(一个字符串)这个参数被传递给应用程序 notepad!!参数也可以写成,如  notepad c:\sfqh.txt  该路径下若已存在该文件则会自动打开,不存在会提示创建。

2) 通过双击鼠标的操作:我们现在有一个 hi.txt 文档,我们在上面双击,那么hi.txt这个文件的路径将作为参数传递给 notepad,也就是说,双击操作可以把文件名作为参数传递给指定的Windows应用程序。

3) 拖拽操作:我们可以把一个叫 hi.txt 的文档,拖拽到 notepad 的程序中,那么hi.txt这个文件的路径将作为参数传递给 notepad,也就是说,拖拽操作可以把文件名作为参数传递给指定的Windows应用程序。

我们可以建立一个程序,读取参数:

1) 建立头文件 StdAfx.h

#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
#endif //添加的
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>

//我在第3行添加了#endif,否则在VC++6.0下编译错误

2) 建立test.cpp 文件

#include "stdafx.h"
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here. MessageBox(NULL,lpCmdLine,"CmdLine",);
return ;
}

下面是我在VC++6.0下的工程文件:

编译成功后,当我们拖拽一个文件到生成的程序的时候,出现(比如我在debug目录下新建txt文档,拖曳到生成的.exe上):

  • nCmdShow   指定窗口第一次出现(程序刚刚启动时)时的显示方式。显示方式有多种,比如:

1) 不显示,nCmdShow = 0;

2) 正常显示,nCmdShow = 1;(默认为1)

3) 最小化显示,nCmdShow = 2;

4) 最大化显示,nCmdShow = 3;

如果需要改变系统的默认的显示方式,需要在创建窗口之前指定nCmdShow的值(通过一个简单的赋值语句nCmdShow = n)

不过,其实这里要让nCmdShow起作用,还需要把nCmdShow作为参数传递给ShowWindow函数

另外,这里稍微说明一下 WINAPI 这个宏定义,我们再看WinMain函数的原型:

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
);

前面的APIENTRY 定义为:

#define APIENTRY    WINAPI

而这里的WINAPI是这样定义的:
#define WINAPI      __stdcall

所以归根到底都是 __stdcall,这个是什么东西了?这里解释一下:

__stdcall一种调用约定(调用函数时候的一种约定),其他的调用约定还有:__cdecl 和 __fastcall

调用约定将决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。 WIN32API使用的是__stdcall调用约定

而标准C,C++使用的是__cdecl调用约定

__stdcall调用约定:函数的参数自右向左压栈,被调用的函数在返回前清理传送参数的内存栈

__cdecl调用约定:每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的调用约定

WinMain函数详解(转载)的更多相关文章

  1. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  2. kzalloc 函数详解(转载)

    用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. view plain /** * kzal ...

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

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

  4. Linux中fork()函数详解(转载)

    [原创地址]http://blog.csdn.net/jason314/article/details/5640969 [转载地址]http://www.cnblogs.com/bastard/arc ...

  5. Interlocked.Increment()函数详解 (转载)

    原文地址 class Program { static object lockObj = new object(); ; ; //假设要处理的数据源 , ).ToList(); static void ...

  6. 【转载】jQuery.extend 函数详解

    转载自:http://www.cnblogs.com/RascallySnake/archive/2010/05/07/1729563.html jQuery.extend 函数详解 JQuery的e ...

  7. 【转载】3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解

    原文:3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解 3D中z值会影响屏幕坐标系到世界坐标系之间的转换,2D中Z值不会产生影响(而只 ...

  8. 【转载】C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    本文转自: C语言itoa()函数和atoi()函数详解(整数转字符C实现) 介绍 C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. int/float to ...

  9. Linux中fork()函数详解(转载)

    linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

随机推荐

  1. C#删除xml中某个节点的子节点方法

    if (File.Exists(xmlFilePath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFilePath); Xm ...

  2. c++之路进阶——bzoj3343(教主的魔法)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ ...

  3. ArrayList和LinkList区别

    ArrayList和LinkList区别 前者是数组的数据结构,后者是链表的数据结构 前者应用于排序和查找,后者应用于插入删除

  4. 为Windows 8新建工具栏模拟“开始菜单”

    微软Windows 8系统的传统桌面中取消了Windows用户熟悉的开始按钮和开始菜单,增加了适合触控操作的磁贴和开始屏幕,部分用户对此感觉不太习惯,认为在传统桌面中还是需要从前那种将所安装程序清晰分 ...

  5. 夺命雷公狗---微信开发55----微信js-sdk接口开发(2)接口功能介绍之签名算法

    我们JS-SDK里面其实有不少的接口 startRecord---录音 stopRecord---停止录音 playVoice---播放 pauseVoice---暂停播放 uploadImage-- ...

  6. cvWaitKey();

    1.函数形式:int cvWaitKey(int delay=0 ): 函数功能:cvWaitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms. 参数:      delay——— ...

  7. SqlServer 的提示符(Option/With等提示符)不是什么时候都可以用的

    我们在做SqlServer的查询调优的时候,经常会在语句末尾用到option(loop/merge/hash join)或在join语句前直接声明loop/merge/hash,来强制SqlServe ...

  8. NOIP201302表达式求值

    NOIP201302表达式求值 题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计 ...

  9. 利用 iptables 命令限制单个端口的并发连接数

    iptables -I INPUT -p tcp --dport 11251:11300 -m connlimit --connlimit-above 10 -j REJECT 以上代码意思: 在IN ...

  10. java小程序整理及排序算法

    1. 利用循环打印如下图形 ***** **** *** ** * public class Main { public static void main(String[] args) { // TO ...