本筆記參考《windows程序設計》Charles Petzold,匯編版本參考《匯編通訊》Zoologist
開始
學習windows程序設計的條件有三:
1 熟悉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'
匯編沒有轉義字符,所以這里的''是對引號的特殊處理,天殺說是由編譯器處理的。