关于编写Windows程序中启动兼容性问题
2024-10-06 07:17:42
之前用qt4编写Windows程序的时候遇到了一个软件在系统的兼容性问题:用户在win10系统下使用这个程序的时候,如果没有用低于win10版本的兼容模式运行的时候,存在运行某部分功能的时候无法使用的问题。
这个问题一开始困扰了我很久,那时我认为的解决方案有两种:
1.将软件从qt4迁移到qt5上
不过在对软件的大小是有限制的,之所以一开始用qt4写这个项目是因为qt4的模块相对于qt5来说小很多,因此这个方案被我否决了
2.程序自启动的时候将系统兼容性设置为win10以下的版本类型
在否决了第一个方案之后,只能采取第二种方案。
windows程序的兼容性是由注册表控制的,其位置Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers
以qt4中将程序设置为win7兼容模式为例子(需要重启才能生效,因为是程序启动后注册表信息才被修改的,读者可自行判断所处系统再进行相应的修改):
HKEY hKey;
LPCTSTR strSubKey = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers";
long lRet = ::RegOpenKeyEx( HKEY_CURRENT_USER, strSubKey, , KEY_WRITE, &hKey );
if ( lRet == ERROR_SUCCESS )
{ const size_t cSize = strlen(QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str())+;
wchar_t* wc = new wchar_t[cSize];
MultiByteToWideChar(CP_ACP, , QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str(),
strlen(QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str()) + , wc, sizeof(wchar_t)* cSize/ sizeof(wc[])); //QCoreApplication::applicationFilePath().replace("/","\\").toLocal8Bit().data();
lRet = ::RegSetValueEx( hKey,wc, NULL, REG_SZ, (LPBYTE)(L"~ WIN7RTM"),); //WIN7RTM可以更换成你想要的兼容的类型
RegCloseKey( hKey );
}
在对注册表信息修改之后,程序本身的兼容性问题并没有得到解决,还得进行重启后才生效,之后再加入重启程序的函数即可。
重启之前必须进行对是否已经在注册表中写入兼容信息进行判断,若已经兼容,那么注册表信息就不必再注册并且重启软件了。
值得注意的是,注册表是通过写入程序的相对位置来判断是否要用兼容性打开那个文件,因此,若程序之前已经兼容性运行过了,如果程序的位置再发生改变之后,再启动的话话并不会以兼容模式运行这个程序,此时又得在注册表中重新写入兼容性信息并且删除之前的兼容性信息后重启程序。
最新文章
- Nancy之基于Nancy.Hosting.Self的小Demo
- mysql日志与备份恢复
- MongoDB 索引相关知识
- php日期处理 -- 获取本周和上周的开始日期和结束日期(备忘)
- 经常使用的webservice接口
- Cannot generate SSPI context---MS SQL ERROR
- 关于C#的那点事........
- 关于TXT转CHM的完整解决方式
- java中log4j的使用体验
- Form表单中method=";post/get'的区别
- Ubuntu14.04安装 HP DeskJet GT 5820 打印机的方法
- ToastMiui【仿MIUI的带有动画的Toast】
- unity开源移动库iTween使用完整Demo
- 升级tomcat需要更改哪些配置?
- 优化openfire服务器提升xmpp 效率的15个方法(原创)
- SQL2005的SSMS连接SQL2012会有问题
- 创建Maven项目出错
- JAVA unicode转换成中文
- 集合(二)LinkedList
- twitter——数据连接
热门文章
- 通过cookies信息模拟登陆
- Python爬虫一
- MIP启发式算法:遗传算法 (Genetic algorithm)
- Linux学习-开机过程的问题解决
- Java中对象方法的调用过程&;动态绑定(Dynamic Binding)
- python偏函数使用
- LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用
- 在. net平台下,推送IOS,Android,Windows Phone消息
- Selenium WebDriver-判断页面中某一元素是否可操作
- [python学习篇][书籍学习][python standrad library][内建类型]之数值