- 相关推荐
准确定制Windows应用程序堆栈大小
在编写Windows应用程序时,我们是通过模块定义文件(.def)中的STACKSIZE语句来定义以字节为单位的应用程序堆栈大小,以用于函数参数的中间存储。根据Windows SDK手册的推荐,最小堆栈大小应为5120字节。事实上,这是一个比实际需求放宽了许多的推荐值。Microsoft公司没有对如何准确设定这一参数提供有效方法。由于Windows本身是一个多任务环境,可以同时运行多个应用程序,因此,我们对堆栈参数的选择会导致有限内存空间的浪费。在此,本文给出一种准确定制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;
我们提供的方法的思路是,在应用程序被加载时,先在堆栈区的栈顶位置到当前SP之间填充固定字节(如0xaa)来进行初始化。在程序执行结束时,通过对堆栈区初始化值的改变情况来计算应用程序所使用的实际堆栈的大小。以上的工作主要依靠下面两个函数来完成。
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