CHtmlView指定IE内核版本

新浪微博的第三方授权页面貌似有修改,导致我写的登陆器程序在使用授权页时就报JS错误。

问题的原因是CHtmlView默认的内核版本太低,有太多不兼容的东西。

在指定内核版本时,需要修改注册表,因此还涉及到程序提权的问题。

所以在解决该问题时,上述两个方面都需要考虑,代码如下:

BOOL RaisePrivileges()
{
	HANDLE TokenHandle;
	TOKEN_PRIVILEGES t_privileges = {0};

	if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &TokenHandle))
	{
		return FALSE;
	}

	if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &t_privileges.Privileges[0].Luid))
	{
		return TRUE;
	}

	t_privileges.PrivilegeCount = 1;
	t_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	
	if(!AdjustTokenPrivileges(TokenHandle, FALSE, &t_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
	{
		CloseHandle(TokenHandle);
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}

void SetIECoreVersion()
{
	wchar_t* path = L"SOFTWARE\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION";
	wchar_t* valueName = L"你的程序.exe";
	long version=9999;
	wchar_t err[1024];
	HKEY hKey;
	DWORD dwDisposition;
	long ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0,REG_LEGAL_OPTION, &hKey);
	if( ret != ERROR_SUCCESS)
	{
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ret, NULL,err,sizeof(err),NULL);
		ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, path,0, NULL, REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL, &hKey, &dwDisposition);
		if( ret != ERROR_SUCCESS)
		{
			FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ret, NULL,err,sizeof(err),NULL);
			return;
		}
	}

	ret = RegSetValueEx( hKey, valueName, NULL, REG_DWORD, (BYTE*)&version, sizeof(version));
	if( ret != ERROR_SUCCESS)
		return;
}

连续调用
RaisePrivileges();
SetIECoreVersion();

即可解决该问题。

你可能感兴趣的:(CHtmlView指定IE内核版本)