解決QQ無法在沙盤中運行的問題


可能不少在沙盤(Sandboxie)里運行QQ的同學都會遇到這樣的問題:

先把QQ裝在沙盤里,然后把QQ的安裝文件夾復制到另一個地方,清空沙盤,再從沙盤中啟動QQ:

QQ出錯

經過排除法查找,確定這個問題是由於兩個安全組件(COM)沒有注冊引起的。這兩個組件的動態鏈接庫文件分別是安裝在以下目錄的SSOCommon.dll和SSOPlatform.dll

c:\program files\common\tencent\TXSSO\版本號\bin\

為了解決這個問題,寫了一個簡單的QQ啟動器,把它放在QQ的bin目錄下,在沙盤里運行它就可以自動注冊這兩個組件,並自動啟動QQ了。是代碼附在下面僅供參考,編譯需要項目文件支持。

點擊這里下載配置好的項目文件包(VS2008)

點擊這里下載編譯好的程序

注意,我當前版本的TXSSO是1.2.1.38。如果你的QQ不是這個版本,請將項目里的兩個dll替換成你的QQ里附帶的版本,並重新編譯。

#include <tchar.h>
#include <windows.h>
#include <atlstr.h>
#include <shlobj.h>
#include "resource.h"

HKEY CreateKey(LPCTSTR lpKey)
{
	HKEY hKey;
	DWORD dwDisp;
	RegCreateKeyEx(HKEY_LOCAL_MACHINE, lpKey, 0, NULL,
		REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
	return hKey;
}

void SetValue(HKEY hKey, LPCTSTR lpName, LPCTSTR lpValue)
{
	CString strValue(lpValue);
	if (lpName)
	{
		RegSetValueEx(hKey, lpName, 0, REG_SZ, (LPBYTE)(LPCTSTR)strValue,
			strValue.GetLength() * sizeof(TCHAR));
	}
	else
	{
		RegSetValue(hKey, NULL, REG_SZ, strValue, strValue.GetLength());
	}
}

void SaveResourceFile(LPCTSTR lpType, DWORD dwResId, LPCTSTR lpFileName)
{
	DWORD dwRet;
	HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(dwResId), lpType);
	HGLOBAL hResMem = LoadResource(NULL, hResInfo);
	DWORD dwSize = SizeofResource(NULL, hResInfo);
	LPVOID lpData = LockResource(hResMem);
	HANDLE hDllFile = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL,
		CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	WriteFile(hDllFile, lpData, dwSize, &dwRet, NULL);
	CloseHandle(hDllFile);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine, int nCmdShow)
{
	CString strRoot, strSubPath, strFile;
	SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES_COMMON,
		NULL, SHGFP_TYPE_CURRENT, strRoot.GetBuffer(MAX_PATH));
	strRoot.ReleaseBuffer();
	strRoot += _T("\\Tencent\\");
	CreateDirectory(strRoot, NULL);
	strRoot += _T("TXSSO\\");
	CreateDirectory(strRoot, NULL);
	strRoot += _T("1.2.1.38\\");
	CreateDirectory(strRoot, NULL);
	strRoot += _T("Bin\\");
	CreateDirectory(strRoot, NULL);


	SaveResourceFile(_T("DLLFILE"), IDR_DLL_SSOCOMMON,
		strRoot + _T("SSOCommon.dll"));
	SaveResourceFile(_T("DLLFILE"), IDR_DLL_SSOPLATFORM,
		strRoot + _T("SSOPlatform.dll"));

	HKEY hKey;

	hKey = CreateKey(_T("SOFTWARE\\TENCENT\\TXSSO"));
	SetValue(hKey, _T("Version"), _T("1.2.1.38"));
	RegCloseKey(hKey);

	hKey = CreateKey(_T("SOFTWARE\\Classes\\SSOAxCtrlForPTLogin.SSOForPTLogin2"));
	SetValue(hKey, NULL, _T("SSOForPTLogin2 Class"));
	RegCloseKey(hKey);

	hKey = CreateKey(_T("SOFTWARE\\Classes\\SSOAxCtrlForPTLogin.SSOForPTLogin2\\CLSID"));
	SetValue(hKey, NULL, _T("{EAAED308-7322-4b9b-965E-171933ADD473}"));
	RegCloseKey(hKey);

	hKey = CreateKey(_T("SOFTWARE\\Classes\\SSOAxCtrlForPTLogin.SSOForPTLogin2\\CurVer"));
	SetValue(hKey, NULL, _T("SSOAxCtrlForPTLogin.SSOForPTLogin.2"));
	RegCloseKey(hKey);

	ShellExecute(NULL, _T("open"), _T("QQ.exe"), NULL, NULL, SW_SHOW);

	return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM