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程序設計》第五版。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM