| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1277 人关注过本帖
标题:XMS内存为何申请失败?
只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 

找到原因了,POPUP_x1,POPUP_y1,POPUP_y1,POPUP_y2为窗口的四个角坐标
1、原来定义为int size;
size = (POPUP_x2 - POPUP_x1 + 1 ) * (POPUP_y2 - POPUP_y1 +1 ) / 1024 + 1;
XMS_Alloc(size);//调用子程序分配XMS空间(以KB为单位)
2、现在更改为
int size;
long long_size;
long_size = ((long)POPUP_x2-(long)POPUP_x1+1)*((long)POPUP_y2-(long)POPUP_y1+1);
long_size = long_size/1024+1;
size = long_size;
XMS_Alloc(size);//调用子程序分配XMS空间(以KB为单位)

但是现在还有1个问题:
窗口最后一列无法恢复。源程序如下:


char XMSBuffer[800];
/*-----------------------------------------------------------
//保存窗口映像到XMS
-----------------------------------------------------------*/
void _Cdecl Save_Image_XMS(void)
{
int i,j;
unsigned int size;
long long_size;
unsigned long offset = 0;
char *pp;

long_size = ((long)POPUP_x2-(long)POPUP_x1+1)*
((long)POPUP_y2-(long)POPUP_y1+1);
long_size = long_size/1024+1;
size = long_size;
if (XMS_Size() > size)
{
if ((xms_window_handle = XMS_Alloc(size)) != 0)
{
size = POPUP_x2 - POPUP_x1;
for (i = POPUP_y1 ; i <= POPUP_y2 ; i++)
{
pp = XMSBuffer;
for (j = POPUP_x1 ; j <= POPUP_x2 ; j++)
*pp++ = getpixel(j,i);
Write_To_XMS(XMSBuffer,size,xms_window_handle,offset);
offset += size;
}
}
else
puts("XMS handle Error...\n");
}
else
puts("not enough XMS...\n");
}

/*-----------------------------------------------------------
//恢复窗口映像从XMS
-----------------------------------------------------------*/
void _Cdecl Restore_Image_XMS(void)
{
int i,j;
unsigned short size;
unsigned long offset = 0;
char *pp;

for (i = POPUP_y1 ; i <= POPUP_y2 ; i++)
{
size = POPUP_x2 - POPUP_x1;
Read_From_XMS(XMSBuffer,size,xms_window_handle,offset);
offset += size;
pp = XMSBuffer;
for (j = POPUP_x1 ; j <= POPUP_x2 ; j++)
putpixel(j,i,*pp++);
}
XMS_Free(xms_window_handle);
}

现在还有1个问题: 窗口最后一列无法恢复,为什么?


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-12-11 16:19
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
最好不要用HUGE模式,HUGE和LARGE差别不大,编译出来的程序都可以一样大,只是HUGE的指针是可比的,LARGE的不可比而已。所以直接用LARGE就OK了,还有就是NEO中的函数可能跟HUGE合不太来。
要不你还可以使用BC++编译,开启覆盖模式,那样编译出来的程序可以有几M,因为它运行时是一块块的读入内存的,要下一块时就将以前读入但暂时没有用的块清除。不过只要TC的LARGE够用,尽量不用这个方案,因为反复的读写程序会导致执行性能的下降。
2006-12-11 17:38
快速回复:XMS内存为何申请失败?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014472 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved