本筆記參考《windows程序設計》Charles Petzold,匯編版本參考《匯編通訊》Zoologist

開始

學習windows程序設計的條件有三:

熟悉windows操作系統,只要使用電腦的人八成都挺熟悉

2了解C語言,作者這么說,我想我會c++應該沒什么問題吧

3準備好開發環境VC6匯編版本使用Masmplus

Window簡史

無非是操作系統的更新換代,微軟就這么贏了。但還是跟著intel的腳步走的吧,intel拿出什么CPU,他就對應更新一下。為了不至于像蘋果那么慘就拖泥帶水的在保護模式下有什么虛擬8086.這樣就可以運行大量8086那個時代的軟件。

關于DLL

書上關于dll做了一些簡單的敘述,應用程序和dll是多對多的關系,如果一個dll為多個應用程序使用,那么該dll為共享dll文件。Dll文件和可執行文件一樣包含可執行代碼,但必須由應用程序直接或間接的調用。如果是靜態連接就是將所有代碼編寫入一個可執行文件,此時當多個應用程序,要調用某個函數時就會有多個拷貝,浪費了內存空間。若采用動態連接,則根據描述信息定位到相應的函數就可以了。并不會有多個拷貝,因為Win32系統保證內存中只有DLL的一份復制品,這是通過內存映射文件實現的。

關于API

API是系統函數和相關數據類型和數據結構的集合。總之是系統現成提供給我們的資源。

Windows版HelloWorld

//========================

// (c)狗尾草2008.1.18

//========================

#include<windows.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)

{

 MessageBox(NULL,"HelloWorld!","Henry's first windows program",MB_OK);

 return 0;

}

有了IDE直接點編譯連接即可,運行結果見圖。

頭文件windows.h中包含了其他windows頭文件,例如

WINDEF.H 基本型態定義。 

WINNT.H 支持Unicode的型態定義。 

WINBASE.H Kernel函數。  

WINUSER.H 使用者接口函數。  

WINGDI.H 圖形設備接口函數。

他們包含了系統的一些函數,數據類型和結構。以及一些常量的定義。

其中WINAPI會比較讓人感到疑惑,其實就是一種調用函數的約定,書上并未給出解釋

#define WINAPI _stdcall

他表示的是一種函數參數的入棧方式,分為c和pascal類型,c是從最后一個參數開始而pascal則剛好相反,其實c的入棧方式可以保證參數個數不確定的情況出現。

大致如下,關于產生函數修飾名沒有什么意義就不講了。

_cdecl

從右至左入棧,由調用者把參數彈出。

_stdcall

從右至左入棧,由被調用者把參數彈出。

WinMain參數詮釋

hInstance是該實例的句柄,用來唯一標識一個實例的常量。

hPrevInstance是該實例前運行的副本,如果已有一個程序運行,可以直接從它那里獲取一些資源。

CmdLine執行程序的命令列,用慣命令的人一定知道的。就是命令后跟著的那些一般帶杠的參數

nShowCmd是程序最初的顯示方式。

MessgeBox函數

第一個參數是窗口句柄,這里沒有定義窗口類,自然也沒什么窗口實例。所以為NULL

第二個參數是顯示的內容

第三個參數是標題欄內容

#define MB_OK 0x00000000L 

最后一個是對話框按鈕,是一些帶MB_前綴的常量。還可以使用或運算符指定圖示。實驗中發現定義圖示時彈出對話框的聲音也發生變化,看來這些常量背后還很復雜。

匯編版本

;========================

; (c)狗尾草 2008.1.18

;========================

.386

.Model Flat, StdCall

Option Casemap :None

include windows.inc

include user32.inc

include kernel32.inc

IncludeLib user32.lib

IncludeLib kernel32.lib

.data

 titles db 'henry''s first windows program'

 content db 'HelloWorld!'

.data?

.code

 start:

 invoke MessageBox,NULL,offset content,offset titles,MB_OKCANCEL

 invoke ExitProcess,0

 end start

.386是指令集指定

.model用來指定內存模式Flat是平坦模式

Option Casemap :None大小寫不區分

Invoke是函數調用語句,其實和c沒什么區別,參數用逗號分隔

編寫過程中

 titles db 'henry''s first windows program'

匯編沒有轉義字符,所以這里的''是對引號的特殊處理,天殺說是由編譯器處理的。