首页 教育论文中心 论文分类 论文搜索 论文发表 汇款确认 会员专区 在线购卡 服务帮助 联系我们 网站地图
当前位置:教育论文中心首页--计算机初中计算机教研论文--准确定制Windows应用程序堆栈大小
推荐论文
·如何撰写调查报告
·暑假社会实践报告--走进
·暑假社会实践报告--走进
·暑期社会实践--企业管理
·大学生寒假实习报告范文-
·民工子女生活现状的大学生
·浙江大学生暑期社会实践报

·师范大学大学生暑期教学社
·大学生暑期农村教育实践报
·大学生暑期“三下乡”社会
科目列表
市场营销 管理理论 人力资源
电子商务 社会实践 先进教育
伦理道德 艺术理论 环境保护
农村研究 交通相关 烟草论文
电子电气 财务分析 融资决策
电影艺术 国学论文 材料工程
语文论文 数学论文 英语论文
政治论文 物理论文 化学论文
生物论文 美术论文 历史论文
地理论文 信息技术 班主任
音乐论文 体育论文 劳技论文
自然论文 德育管理 农村教育
素质教育 三个代表 旅游管理
国际贸易 哲学论文 工商管理
证券金融 社会学 审计论文
会计论文 建筑论文 电力论文
水利论文 园林景观 农林学
中医学 西医学 心理学
公安论文 法学法律 思想汇报
法律文书 总结报告 演讲稿
物业管理 经济学 论文指导
计算机 护理论文 社会调查
军事论文 化工论文 财政税收
保险论文 物流论文 语言教育
教育教学 给水排水 暖通论文
结构论文 综合类别  

 
准确定制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 dispatch messages until a wm-quit message
is received. */
while (getmessage(&msg, /*message structure*/
null, /*handle of window receiving the message*/
null, /*lowest message to examine*/
null)) /*highest message to examine*/
{
translatemessage(&msg); /*translates virtual key codes*/
dispatchmessage(&msg); /*dispatches message to window*/
}
wsprintf(szechomsg, actual stack size:%u\n\r,cacustack
());
outputdebugstring(szechomsg);
return(msg.wparam); /*returns the value from postquitmes
sage */
}
要注意的是,利用本文提供的方法来对具体程序进行堆栈大小的计算时,使用者应反复多次运行应用程序,并逐一执行程序中的不同功能,记录下每次退出程序所显示的实际堆栈大小,取其中的最大值,略放余量后回填到.def文件的stacksize语句中。
 
<<<<<全文未完>>>>> 全文字数约566字
是否要阅读全文?点卡会员将扣除1点!点击阅读全文
 
 
 
版权所有 教育论文中心 Copyright(C) All Rights Reserved
联系方式: QQ:277865656
或写信给我