zoukankan      html  css  js  c++  java
  • 第一个Windows应用程序--启动函数、入口点函数与退出函数

    1.入口点函数

    Windows 应用程序必须有一个入口点函数,应用程序开始运行时,这个函数会被调用。使用Win32 SDK开发程序的入口函数如下:

    1. int WINAPI WinMain(  
    2.     HINSTANCE hInstanceExe,  
    3.     HINSTANCE,  
    4.     PTSTR pszCmdLine,  
    5.     int nCmdShow);  

    1)hInstanceExe参数实际值是一个内存基地址;系统将可执行文件的映像加载到进程地址空间中的这个位置。例如,系统打开可执行文件,并将它的内容加载到地址0x00400000,则(w)WinMain的hInstanceExe参数值为0x00400000.

    可执行文件的映像具体加载到哪一个基地址,是由链接器决定的。

    2)第二个参数用于16位Windows系统,对32位系统都应传递NULL

    3)pszCmdLine 是用来运行程序的命令行。有些Windows程序在启动时用它来把文件装入内存

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


    2.启动函数

    操作系统实际上并不调用我们所写的入口点函数。相反,它会调用由C/C++运行库实现并在链接时使用-entry:命令行选项来设置的一个C/C++运行时启动函数。该函数将初始化C/C++运行库,使我们能调用malloc和free之类的函数。它还确保了在我们的代码开始执行之前,我们声明的任何全局和静态C++对象都被正确构造。


    入口函数和启动函数:
    WinMain -- WinMainCRTStartup
    wWinMain -- wWinMainCRTStartup
    Main -- mainCRTStartup
    Wmain --  wmainCRTStartup

    其中开头的w表示Unicode版本。


    在链接时,链接器将选择正确的C/C++运行库启动函数。链接器查找代码中包含四个入口函数中的哪一个,并嵌入相应的C/C++启动函数。
    启动函数的用途:
    1)获取指向新进程的完整命令行的一个指针
    2)获取指向新进程的环境变量的一个指针
    3)初始化C/C++运行库的全局变量
    4)初始化C运行库内存分配函数(malloc和calloc)和其他底层I/O例程使用的堆(heap)
    5)调用所有全局和静态C++对象的构造函数
    完成所有这些初始化工作之后,C/C++启动函数就会调用应用程序的入口点函数。
    例如写了一个_tWinMain函数,且定义了_UNICODE,其调用过程将如下所示:
    1. GetStartupInfo(&StartupInfo);  
    2. int nMainRetVal = wWinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineUnicode,   
    3.     (StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ? StartupInfo.wShowWindow : SW_SHOWDEFAULT);  

    _ImageBase是一个链接器定义的伪变量,表明可执行文件被映射到应用程序内存中的什么位置。


    3.exit函数

    入口点函数返回后,启动函数将调用C运行库函数exit,向其传递返回值nMainRetVal。
    exit函数执行以下任务:
    1)调用_onexit函数调用所注册的任何一个函数
    2)调用所有全局和静态C++类对象的析构函数
    3)在DEBUG生成中,如果设置了_CRTDUG_LEAK_CHECK_DF标志,就通过调用_CrtDumpMemoryLeak函数来生成内存泄露报告。

    4)调用操作系统的ExitProcess函数,向其传入nMainRetVal。这会导致操作系统“杀死”我们的进程,并设置它的退出码。


    4.最简单的windows程序代码示例

    1. /* 
    2.  * HelloMsg.c -- Displays "Hello, Windows" in a message box 
    3.  * guzhoudiaoke@126.com 
    4.  * 2012-11-6 
    5.  */  
    6.   
    7. #include <Windows.h>  
    8.   
    9. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)  
    10. {  
    11.     MessageBox(NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);  
    12.   
    13.     return 0;  
    14. }  

    5.运行结果

  • 相关阅读:
    HDU 1002 大数A+B
    HDU 2066 一个人的旅行(最短路)
    HDU 1869 六度分离(最短路 floyd)
    HDU 1159 Common Subsequence(LCS)
    POJ 3061 Subsequence(尺取法)
    NYOJ 10 skiing(记忆化搜索)
    dedecms添加全站的rss订阅功能
    dedecms artlist读取全站最新文章
    dedecms的title怎么优化?
    DedeCMS提示Maximum execution time of 30 seconds exceeded in解决办法
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878938.html
Copyright © 2011-2022 走看看