- 相關推薦
準確定制Windows應用程序堆棧大小
在編寫Windows應用程序時,我們是通過模塊定義文件(.def)中的STACKSIZE語句來定義以字節(jié)為單位的應用程序堆棧大小,以用于函數參數的中間存儲。根據Windows SDK手冊的推薦,最小堆棧大小應為5120字節(jié)。事實上,這是一個比實際需求放寬了許多的推薦值。Microsoft公司沒有對如何準確設定這一參數提供有效方法。由于Windows本身是一個多任務環(huán)境,可以同時運行多個應用程序,因此,我們對堆棧參數的選擇會導致有限內存空間的浪費。在此,本文給出一種準確定制Windows應用程序堆棧大小的方法,具體的實現方法如下。
根據Andrew Schulman在《未公開的Windows核心技術》中提供的資料,在應用程序的實例句柄所指向的缺省數據段起始位置,Windows定義了如下的INSTDATA結構:
typedef struct {
WORD wMustBeZero; //此參數必須為零
DWORD dw01dSSSP; //保存當前的SS:SP指針;
WORD pLocalHeap; //指向局部堆信息結構的近指針
WORD pAtomTable; //指向任務原子表的近指針
WORD pStackTop; //指向棧頂的近指針
WORD pStackMin; //當前使用的堆棧大小
WORD pStackBottom; //指向棧底的近指針
} INSTDATA;
我們提供的方法的思路是,在應用程序被加載時,先在堆棧區(qū)的棧頂位置到當前SP之間填充固定字節(jié)(如0xaa)來進行初始化。在程序執(zhí)行結束時,通過對堆棧區(qū)初始化值的改變情況來計算應用程序所使用的實際堆棧的大小。以上的工作主要依靠下面兩個函數來完成。
1.堆棧初始化函數
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.堆棧大小計算函數
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));
}
在應用程序中調用以上兩個函數以定制堆棧大小的方法如下例所
示:
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]
【準確定制Windows應用程序堆棧大小】相關文章:
準確04-29
WINDOWS XP教案04-25
安裝Windows或啟動Windows時鼠標不可用06-20
定制04-29
大小04-29
windows及應用實踐報告04-14
初識Windows的教學方案01-17
準確定位作文09-25
重提準確把握教材04-30
廣告的定位要準確04-29