以前用qt4编写Windows程序的时候遇到了一个软件在系统的兼容性问题:用户在win10系统下使用这个程序的时候,若是没有用低于win10版本的兼容模式运行的时候,存在运行某部分功能的时候没法使用的问题。windows
这个问题一开始困扰了我好久,那时我认为的解决方案有两种:app
1.将软件从qt4迁移到qt5上ide
不过在对软件的大小是有限制的,之因此一开始用qt4写这个项目是由于qt4的模块相对于qt5来讲小不少,所以这个方案被我否决了函数
2.程序自启动的时候将系统兼容性设置为win10如下的版本类型spa
在否决了第一个方案以后,只能采起第二种方案。code
windows程序的兼容性是由注册表控制的,其位置Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layersblog
以qt4中将程序设置为win7兼容模式为例子(须要重启才能生效,由于是程序启动后注册表信息才被修改的,读者可自行判断所处系统再进行相应的修改):qt
HKEY hKey; LPCTSTR strSubKey = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"; long lRet = ::RegOpenKeyEx( HKEY_CURRENT_USER, strSubKey, 0, KEY_WRITE, &hKey ); if ( lRet == ERROR_SUCCESS ) { const size_t cSize = strlen(QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str())+1; wchar_t* wc = new wchar_t[cSize]; MultiByteToWideChar(CP_ACP, 0, QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str(), strlen(QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str()) + 1, wc, sizeof(wchar_t)* cSize/ sizeof(wc[0])); //QCoreApplication::applicationFilePath().replace("/","\\").toLocal8Bit().data(); lRet = ::RegSetValueEx( hKey,wc, NULL, REG_SZ, (LPBYTE)(L"~ WIN7RTM"),18); //WIN7RTM能够更换成你想要的兼容的类型 RegCloseKey( hKey ); }
在对注册表信息修改以后,程序自己的兼容性问题并无获得解决,还得进行重启后才生效,以后再加入重启程序的函数便可。it
重启以前必须进行对是否已经在注册表中写入兼容信息进行判断,若已经兼容,那么注册表信息就没必要再注册而且重启软件了。io
值得注意的是,注册表是经过写入程序的相对位置来判断是否要用兼容性打开那个文件,所以,若程序以前已经兼容性运行过了,若是程序的位置再发生改变以后,再启动的话话并不会以兼容模式运行这个程序,此时又得在注册表中从新写入兼容性信息而且删除以前的兼容性信息后重启程序。