如何让自己的软件兼容不同的操作系统?
我发现自己在win2000下作的程序,在98下运行都不太正常,会出现资源耗尽的现象
这应该怎么解决??
问题点数:100、回复次数:18Top
1 楼cwanter(亚玛逊河上的渔夫)回复于 2002-09-15 11:20:50 得分 0
2k与98的区别主要是unicode和安全性问题,还有就是有的函数2000下有,98下没有。Top
2 楼lanfengjiyue(歪脚鸭)回复于 2002-09-15 11:23:00 得分 0
不太好解决。这和操作系统底层有关。Top
3 楼stonespace(stonespace)回复于 2002-09-15 11:25:43 得分 40
资源耗尽不是兼容性问题,使程序本身的问题,检查一下是否有内存泄漏,是否有GDI资源文件句柄等泄漏,new/malloc等动态内存分配是否用得太多了导致内存碎片问题。
另外在DC上画图9x下更容易溢出,避免使用太大的坐标。如果使用多线程,9x的时间片也比2k长。
Top
4 楼batman4242()回复于 2002-09-15 11:30:30 得分 0
如果内存泄漏那么为什么2000会运行的好好的呢,是不是二者管理的方式不同Top
5 楼noproblem_jyb(ybjiang)回复于 2002-09-15 11:42:12 得分 0
的确有很大的不同。
比如,在Win2k下,scroll bar的范围是32bit的值; 但在Win9x下虽说也使用32-bits,但实际只使用了低16-bits.
另外,在Win9x下有些函数名存实亡,只会return一个false,用GetLastError(),system will tell you, "NOT IMPLEMENTED". ooh...
Top
6 楼guzizhao()回复于 2002-09-15 11:54:06 得分 0
看看是不是api不一样。Top
7 楼stonespace(stonespace)回复于 2002-09-15 11:59:57 得分 40
象这种资源耗尽的问题,应该具体检查原因,很难说的,如果程序没有问题,再考虑使不是操作系统的问题。不过以前我还没见过因为操作系统bug,导致资源耗尽的例子。
检查内存泄漏,可以用vc运行debug版,退出的时候如果有内存泄漏vc会输出信息。其它系统资源可以看系统技术器,检查运行程序之前和之后各类句柄数目是否发生累积性变化。
有时候2k比较健壮一些,发生错误的时候比9x难表现出来,并不代表程序没有错误。Top
8 楼Jason_guo(梦想难成,努力能成!)回复于 2002-09-15 12:04:18 得分 0
看来移植的问题挺烦恼的。我是学JAVA的,还没有遇到这些问题。:)Top
9 楼tttc(Azure)回复于 2002-09-15 13:00:16 得分 0
2k与98在内存管理方面有些不同,2k较健壮,因此较严格。因此,你的关于内存存取的一些API可能有些问题,回去再仔细看看吧!
Top
10 楼sans(长风半日)回复于 2002-09-15 13:14:04 得分 0
多看看一些函数的说明。尽量使用win32的标准,而不是使用nt的标准。
可以在软件启动时取得操作系统的版本,并且在有影响的功能上采取不同的函数。Top
11 楼nevergrief(孤独骑士)回复于 2002-09-15 15:06:50 得分 20
简单呀,启动时,判断操作系统版本,如果是98,就不工作或者退出!!!
dwVersion = GetVersion(); //获得Windows NT或Win32的版本号
if (dwVersion < 0x80000000)
{// Windows NT系列
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // 设置一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else
{//Windows 95系列
ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);
}
用注册表也可以
Reg.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
Reg.Read("ProductName", m_strRenameWin);
Top
12 楼maoxianwang(傻蛋)回复于 2002-09-15 15:28:29 得分 0
最好写两个版本Top
13 楼batman4242()回复于 2002-09-18 11:59:54 得分 0
如果是时间片的原因那会有什么现象?Top
14 楼onestab()回复于 2002-09-18 12:11:01 得分 0
有时候2k比较健壮一些,发生错误的时候比9x难表现出来,并不代表程序没有错误。
很对!!Top
15 楼albert()回复于 2002-09-18 12:22:48 得分 0
不同的API函数在不同的系统里的支持程度不一样,建议仔细看看你所用到的函数在MSN中的Remarks说明。Top
16 楼qing_li73(Vincent Lee)回复于 2002-09-18 13:06:47 得分 0
写的时候就要注意测试,在不同平台下工作情况,牵扯到内存的部分尤其要小心。Top
17 楼rushing(勇敢的心)回复于 2002-09-18 13:20:32 得分 0
用C#或者Java可以适应不同的操作系统,Delphi也可以。
Top
18 楼dimcat(不管白猫还是黑猫,抓到老虎的就是好猫)回复于 2002-09-18 16:00:28 得分 0
就象许多软件有 for win95 ; foe win98 ; for nt .....
一样,应该有多个版本
特别是win9x 与 win2000,xp之间
Top




