程序在Win7下无法正常运行,XP却可以,怎么办?

wubicheng 2013-08-13 10:05:37
我用Win32 API写的一个程序,在Win7 Aero模式下运行极不稳定,经常出错,但是切换到Windows经典模式或XP操作系统就一点问题都没有了,我希望我的程序在Win7下不需要别人更改风格也可以正常运行,该怎么做才行?我尝试过把VS的编译环境从Win32平台换成X64平台,但是编译后在Win7 Aero模式下依然不能运行。
...全文
3332 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-12-05
  • 打赏
  • 举报
回复
既然是AVI播放异常(怀疑是缺少特定的视频解码器),试试安装QQ影音(自动附带安装了很多视频解码器)。
wubicheng 2013-08-16
  • 打赏
  • 举报
回复
呃,郁闷了,官方好像没有说Win7 Aero模式下有什么需要注意的地方,净是些Aero模式下的什么鬼新特性,新效果,全是说自己好的,也有可能是我检索功底不够没有找到,麻烦找到的帮个忙贴个地址。其他网站我还没有去问,主要是没有那些网站的账号,而且个人感觉在CSDN上都问不出个所以然,在其他网站估计也好不到哪里去。 今天又出了新的问题,原来测试时我是在虚拟机下测试的XP系统,当时程序有一段AVI视频总是放不出来,运行到那里画面也是会卡住,但是程序不会未响应,可以直接通过设定的按键跳过视频,后面就一切正常了,我原以为是虚拟机上的XP系统有问题,如果是在主机上就不会有,并且程序在Win7兼容模式下运行的很正常,什么问题都没有,所以就没有太在意这个问题,但是我今天把程序拿到一台XP系统的电脑上运行,发现问题依然存在,我就觉得不对头了,这个程序好像不是单纯不兼容Win7的问题,大家结合这个现象,再来看看这个问题,能不能够找到解决问题的突破点? 顺带着跟赵老师说一下,我还是用的MCI处理的音频和视频,没有用你推荐的那个ActiveX控件,主要是因为程序那时功能已经写得差不多了,如果换ActiveX控件的话,大部分代码可能又要重新写,那前面的努力就白忙活了。MCI虽然播放多媒体确实不是太稳定,但是它与C兼容的很好,用C可以很方便的调用,并且我就对这个比较熟,而像ActiveX控件,在网上查资料好像大部分情况下都是用在MFC程序或基于对话框的程序中,这与我的情况不符,过渡到C比较吃力,当然我这说的不是赵老师那个ActiveX控件,而是其他的一些处理音频和视频的ActiveX控件,赵老师那个现在还没有认真的去研究过,等以后有时间我再去研究,现在只想先把这个程序搞出来。
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
在Win7下的资源管理器中,鼠标右键点你的exe文件,左键选属性,在弹出的属性对话框中找选项“以xxx兼容模式运行”,在其上打勾。
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
的exe文件,左键选属性,在弹出的属性对话框中找选项“以xxx兼容模式运行”,在其上打勾。
wubicheng 2013-08-14
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
有时“未响应”只是说明你的代码在某个长时间循环(且循环中没有调用阻塞函数)中漏写
Sleep(100);
MSG msg;
if (GetMessage(&msg,NULL,0,0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
了而已。
不是有时未响应,我说的是未响应后过一段时间可以自动恢复过来,这个时间有时长有时短,不固定,如果程序一开始就未失去焦点则不会出现未响应的情况,然后是我的代码里有类似Sleep的处理,不过我是通过简单的循环来实现的。然后消息循环我不是用的GetMessage,我用的是PeekMessage,这是我的程序消息循环代码:

while(true)
	{
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{   
			if(WM_QUIT==msg.message)
				break;
			if(!g_hDlgModeless||!IsDialogMessage(g_hDlgModeless,&msg))
			{
				TranslateMessage(&msg) ;
				DispatchMessage(&msg) ;
			}     
		}       
		else
		{
			g_iCurTime=GetTickCount();
			if(g_iCurTime-g_iPreTime>=FRAMERATE)
			{
				hdc=GetDC(hwnd);
				Render(hwnd,g_iCurTime);
				if(g_iTime<200&&g_iTime>=100||g_iTime>=100*NPCNUM+200&&g_iTime<100*NPCNUM+300)
					Update(hwnd);
				ReleaseDC(hwnd,hdc);
				g_iPreTime=GetTickCount();
			}
		}
	}
引用 15 楼 zhao4zhong1 的回复:
《Windows编程启示录》 19.6 为什么有些进程在被终止之后还停留在任务管理器中 当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。 例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。 如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。 如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。 …… 换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。
我的程序没有这种情况,我关闭程序后,程序的进程就结束了,我刚刚特意打开任务管理器试过了。并且如果进程已经停止了的话,怎么解释程序可以恢复,并且恢复后画面是可以与卡死的时间对应得上的呢?而且我的程序中还有个启动界面也有这个问题,但是资源加载完后,它依然能够打开我的主窗口,说明启动界面虽然在画面上卡死了,但是依然在执行,否则它是如何关闭自己并且打开我的主界面的呢?不知道我有没有正确理解你这段话的意思,如果没有,希望你再说明白一些吧。
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
《Windows编程启示录》 19.6 为什么有些进程在被终止之后还停留在任务管理器中 当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。 例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。 如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。 如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。 …… 换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
有时“未响应”只是说明你的代码在某个长时间循环(且循环中没有调用阻塞函数)中漏写
Sleep(100);
MSG msg;
if (GetMessage(&msg,NULL,0,0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
了而已。
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
办法总是会比问题多! http://www.nirsoft.net/utils/app_crash_view.html
wubicheng 2013-08-14
  • 打赏
  • 举报
回复
我也想啊,但是它崩溃的时候不弹出任何错误对话框,你要不关闭程序,它过一段时间又会自动好起来,要是关闭程序,程序就会未响应,然后弹出的是Win7系统那个检查错误解决方案的对话框,但是上面就个取消按钮,怎么进入调试状态呢?

关闭程序时出现:


点击“关闭程序”按钮后出现:


然后就没了,呵呵,压根就不给你调试机会,郁闷啊。

程序出错的现象在
http://bbs.csdn.net/topics/390544248?page=1#post-395282409
如果赵大神还没看的话最好去看看,现象都在那个帖子的前几楼里。
这个程序不知道属不属于崩溃,因为如果真崩溃了,为什么我通过工具 -> 文件夹选项 -> 查看 -> 高级设置,更改高级设置里的任意一项,然后应用就可以让程序恢复呢?并且恢复时可以看得出来程序在崩溃阶段一直在运行,因为恢复后画面是可以和时间对应上的,也就是说如果我把这个程序同时打开两个,然后让其中一个崩溃,另一个正常运行,通过我上面的奇葩方法恢复崩溃的程序后可以发现崩溃的程序当前所播放的画面与未崩溃的程序当前所播放的画面是相同的,所以我就想它是不是只是画面卡死,但是其实程序还是在运行。
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
引用 19 楼 wubicheng 的回复:
哦,这个我在你的留言中看到了,不好意思哈,我一开始只在留言里回复了: 兼容模式下没有问题,但是这与让用户将风格改成经典模式没有多大区别,我是想让我的程序在Win7正常情况下也能跑起来,这样才是最好的,你能不能再帮忙想想有没有什么方法可以达到这一点?先谢谢了。
在微软的官方文档中搜搜看有没有类似“Win7 Aero模式下开发注意事项”的资料参考一下。 或到 stackoverflow.com www.sourceforge.net www.codeproject.com 等网站问问看。
wubicheng 2013-08-14
  • 打赏
  • 举报
回复
哦,这个我在你的留言中看到了,不好意思哈,我一开始只在留言里回复了: 兼容模式下没有问题,但是这与让用户将风格改成经典模式没有多大区别,我是想让我的程序在Win7正常情况下也能跑起来,这样才是最好的,你能不能再帮忙想想有没有什么方法可以达到这一点?先谢谢了。
wubicheng 2013-08-13
  • 打赏
  • 举报
回复
错误见我另外发的一个帖子,里面有详细描述,因为文字太多,我就不在这里重复了。 http://bbs.csdn.net/topics/390544248?page=1#post-395282409
max_min_ 2013-08-13
  • 打赏
  • 举报
回复
是不是那里系统库没有匹配到呢? 把错误贴出来看看!
wubicheng 2013-08-13
  • 打赏
  • 举报
回复
好吧,我错了,你的程序没有问题,环境变量的Path改成了短路径,但是我的程序依然有问题,好像不是环境变量不对。求大神继续帮忙。
赵4老师 2013-08-13
  • 打赏
  • 举报
回复
在cmd窗口里面运行 PathShortener.exe >path.txt
wubicheng 2013-08-13
  • 打赏
  • 举报
回复
我每个文件都对应搜到了,不缺文件,而且我想应该不是找不到文件,因为如果找不到某个DLL,编译时就会报错,应该不存在那种编译的时候找得到文件,独立运行就找不到文件的情况吧? 还有,赵大神,你那个程序运行好像不成功啊,运行之后在哪里找那个path.txt?没看到。在整个工程文件夹下都没有找到你那个生成的文件,我是64位的Win7操作系统,你那个程序不会也不兼容吧?
赵4老师 2013-08-13
  • 打赏
  • 举报
回复
特别提醒:XP下c:\windows\system32\目录下的dll要拷贝到Win7 64位系统的c:\windows\syswow64\目录下,而不是c:\windows\system32\目录下。理由是: 在64位Windows下: 64位dll在目录c:\windows\system32目录下; 32位dll在目录c:\windows\syswow64目录下;
赵4老师 2013-08-13
  • 打赏
  • 举报
回复
你可以先试试对4楼输出窗口中的dll逐一检查,看相应目录下的文件是否都存在,如果某些dll文件不是在 system32或syswow64目录下,对应拷贝它到system32或syswow64目录,注意两个目录别弄混了。 另外你还可以参考下面: 总是发现Path环境变量被某些软件安装时错误修改。比如带空格的目录名未加引号、带汉字的目录引起目录查找混乱等问题,严重影响系统查找可执行文件和dll。 编译此源代码,生成PathShortener.exe,然后在cmd窗口里面运行PathShortener.exe>path.txt,打开path.txt,手动将其内容拷贝粘贴覆盖修改‘我的电脑、属性、高级、环境变量、系统变量、Path、编辑、变量值’即可纠正设置错误的Path http://download.csdn.net/detail/zhao4zhong1/2652343
wubicheng 2013-08-13
  • 打赏
  • 举报
回复
啊,帖子又掉下去了,有没有人知道啊,求解答。
加载更多回复(2)
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7及后续用户,可以直接运行程序。 同时鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388 所有的更新以及技术支持都可以到该博客上找到。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧