- 相關(guān)推薦
準(zhǔn)確定制Windows應(yīng)用程序堆棧大小
在編寫Windows應(yīng)用程序時,我們是通過模塊定義文件(.def)中的STACKSIZE語句來定義以字節(jié)為單位的應(yīng)用程序堆棧大小,以用于函數(shù)參數(shù)的中間存儲。根據(jù)Windows SDK手冊的推薦,最小堆棧大小應(yīng)為5120字節(jié)。事實上,這是一個比實際需求放寬了許多的推薦值。Microsoft公司沒有對如何準(zhǔn)確設(shè)定這一參數(shù)提供有效方法。由于Windows本身是一個多任務(wù)環(huán)境,可以同時運行多個應(yīng)用程序,因此,我們對堆棧參數(shù)的選擇會導(dǎo)致有限內(nèi)存空間的浪費。在此,本文給出一種準(zhǔn)確定制Windows應(yīng)用程序堆棧大小的方法,具體的實現(xiàn)方法如下。
根據(jù)Andrew Schulman在《未公開的Windows核心技術(shù)》中提供的資料,在應(yīng)用程序的實例句柄所指向的缺省數(shù)據(jù)段起始位置,Windows定義了如下的INSTDATA結(jié)構(gòu):
typedef struct {
WORD wMustBeZero; //此參數(shù)必須為零
DWORD dw01dSSSP; //保存當(dāng)前的SS:SP指針;
WORD pLocalHeap; //指向局部堆信息結(jié)構(gòu)的近指針
WORD pAtomTable; //指向任務(wù)原子表的近指針
WORD pStackTop; //指向棧頂?shù)慕羔?/p>
WORD pStackMin; //當(dāng)前使用的堆棧大小
WORD pStackBottom; //指向棧底的近指針
} INSTDATA;
我們提供的方法的思路是,在應(yīng)用程序被加載時,先在堆棧區(qū)的棧頂位置到當(dāng)前SP之間填充固定字節(jié)(如0xaa)來進(jìn)行初始化。在程序執(zhí)行結(jié)束時,通過對堆棧區(qū)初始化值的改變情況來計算應(yīng)用程序所使用的實際堆棧的大小。以上的工作主要依靠下面兩個函數(shù)來完成。
1.堆棧初始化函數(shù)
void FAR PASCAL SetStack(void)
{
BYTE near *npStackTop,near *npStackCurrent;
npStackTop=((NPINSTDATA)0x0000)→pStackTop;
-asm mov npStackCurrent,SP;
npStackCurrent-=2;
while(npStackTop<npStackCurrent) *npStackTop =0xaa;
}
2.堆棧大小計算函數(shù)
WORD FAR PASCAL CacuStack(void)
{
BYTE near *npStackTop,near *npStackBottom;
npStackTop=((NPINSTDATA)0x0000)→pStackTop;
npStackBottom=((NPINSTDATA)0x0000)→pStackBottom;
while(*npStackTop=0xaa) npStackTop ;
return((WORD)(npStackBottom-npStackTop));
}
在應(yīng)用程序中調(diào)用以上兩個函數(shù)以定制堆棧大小的方法如下例所
示:
int PASCAL WinMain(hInstance, hPrevInstance, 1pCmdLine,
nCmdShow)
HANDLE hInstance; /*current instance*/
HANDLE hPrevInstance; /*previous instance*/
LPSTR 1pCmdLine; /*command line*/
int nCmdShow; /*show-window type (open/icon)*/
{
char szEchoMsg[60];
MSC msg;
SetStack ();
if (!hPrevInstance) /*Other instances of app running?*/
if (!InitApplication(hInstance)) /*Initialize shared thi
ngs*/
return (FALSE); /*Exit if unable to initialize*/
/*Perform initializations that apply to a specific insta
nce*/
if (!InitInstance(hInstance,nCmdShow))
return (FALSE);
/*Acquire and di
[1] [2]
【準(zhǔn)確定制Windows應(yīng)用程序堆棧大小】相關(guān)文章:
準(zhǔn)確04-29
WINDOWS XP教案04-25
安裝Windows或啟動Windows時鼠標(biāo)不可用06-20
定制04-29
大小04-29
windows及應(yīng)用實踐報告04-14
初識Windows的教學(xué)方案01-17
準(zhǔn)確定位作文09-25
重提準(zhǔn)確把握教材04-30
廣告的定位要準(zhǔn)確04-29