可能不少在沙盘(Sandboxie)里运行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里附带的版本,并重新编译。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #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; } |
![]() |
作者:王雨濛;新浪微博:@吉祥村码农;来源:《程序控》博客 -- http://www.cnblogs.com/devymex/ 此文章版权归作者所有(有特别声明的除外),转载必须注明作者及来源。您不能用于商业目的也不能修改原文内容。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库