还是昨天,还是同一个哥们。他要实现一个语音叫号的功能,要先普通话叫号,然后再粤语叫号。
诡异的事情发生了,在调试状态下,怎么运行都是正常的,
但直接双击运行,只能叫第一种声音(粤语或普通话),另一个声音(粤语或普通话)怎么都发不出来。
悲剧的是,他语音叫号也是调用了一个dll。
只好慢慢调试了,开始以为是线程退出的太快,或者变量作用域问题,或变量中繁体中文乱码问题,或者函数退出太快,或者是release时优化掉了…
弄了一个多小时,没有任何进展。无奈之下,我翻出了Process Explorer,去查看环境变量。
结果调试的时候,第一个环境变量是
__COMPAT_LAYER=WinXpsp3
天啊,这不是兼容模式吗。
于是将exe设成兼容模式,双击运行,就好了。
原来,他用BCB6做开发,在Win7 sp1上无法正常运行,就设成了兼容模式,调试时运行的exe当然也继承了兼容模式的环境变量咯。
吐血啊……
回家,搜了一下__COMPAT_LAYER环境变量,可以设置为以下数值:
兼容性:
值 | 兼容模式 |
WIN95 | Windows 95 |
WIN98 | Windows 98 / Windows Me |
NT4SP5 | Windows NT 4.0 (Service Pack 5) |
WIN2000 | Windows 2000 |
WINXP | Windows XP |
WINXPSP2 | Windows XP (Service Pack 2) |
WINXPSP3 | Windows XP (Service Pack 3) |
WINSRV03SP1 | Windows Server 2003 (Service Pack 1) |
WINSRV08SP1 | Windows Server 2008 (Service Pack 1) |
VISTARTM | Windows Vista |
VISTASP1 | Windows Vista (Service Pack 1) |
VISTASP2 | Windows Vista (Service Pack 2) |
WIN7RTM | Windows 7 |
权限:
值 | 权限 |
RUNASADMIN | 以管理员权限运行 |
RUNASINVOKER | 以调用者权限运行 |
显示模式:
值 | 显示模式 |
DISABLETHEMES | 禁用视觉主题 |
640X480 | 用640×480屏幕分辨率运行 |
HIGHDPIAWARE | 高DPI设置时禁用显示缩放 |
256COLOR | 用256色运行 |
DISABLEDWM | 禁用桌面元素 |
另外,也可以通过注册表,设置程序的兼容模式:
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] "D:\\TEST\\Hello.exe"="WINXPSP3"
HKEY hKey; LPCTSTR strSubKey = "Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"; long lRet = ::RegOpenKeyEx( HKEY_CURRENT_USER, strSubKey, 0, KEY_WRITE, &hKey ); if ( lRet == ERROR_SUCCESS ) { TCHAR achValue[] = { _T("WINXPSP3") }; CString strExePath = _T("D:\\Test\\Hello.exe"); lRet = ::RegSetValueEx( hKey, strExePath, NULL, REG_SZ, (LPBYTE)&achValue, sizeof(achValue) ); RegCloseKey( hKey ); }