#include "framework.h"
#include <aclapi.h>
#include <shlwapi.h>
#include <shellapi.h>
#include "WeChatLauncher.h"
#pragma comment(lib,"Shlwapi.lib")
bool
getVxInstallPath(
WCHAR
* pathStr)
{
HKEY
hKey;
LPCWSTR
keyPath = L
"SOFTWARE\\Tencent\\WeChat"
;
LONG
openResult = RegOpenKeyEx(HKEY_CURRENT_USER, keyPath, 0, KEY_ALL_ACCESS, &hKey);
if
(openResult == ERROR_SUCCESS) {
DWORD
valueSize = 4095;
LONG
queryResult = RegQueryValueEx(hKey, L
"InstallPath"
,
nullptr
,
nullptr
, (
LPBYTE
)pathStr, &valueSize);
if
(queryResult == ERROR_SUCCESS) {
RegCloseKey(hKey);
return
true
;
}
else
{
::MessageBox(NULL, L
"无法读取注册表值"
, L
"提示"
, MB_OK);
}
}
else
{
::MessageBox(NULL, L
"无法打开注册表键"
, L
"提示"
, MB_OK);
}
RegCloseKey(hKey);
return
false
;
}
void
enableMultiWeChat()
{
HANDLE
hMutex = CreateMutexW(NULL, FALSE, L
"_WeChat_App_Instance_Identity_Mutex_Name"
);
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
PSID pEveryoneSID = NULL;
char
szBuffer[4096] = { 0 };
PACL pAcl = (PACL)szBuffer;
AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID);
InitializeAcl(pAcl,
sizeof
(szBuffer), ACL_REVISION);
AddAccessDeniedAce(pAcl, ACL_REVISION, MUTEX_ALL_ACCESS, pEveryoneSID);
SetSecurityInfo(hMutex, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pAcl, NULL);
}
int
APIENTRY wWinMain(_In_
HINSTANCE
hInstance,
_In_opt_
HINSTANCE
hPrevInstance,
_In_
LPWSTR
lpCmdLine,
_In_
int
nCmdShow)
{
WCHAR
WeChatPath[4096] = { 0 };
size_t
bufSize = 4096;
if
(getVxInstallPath(WeChatPath))
{
if
(!wcscat_s(WeChatPath, bufSize, L
"\\WeChat.exe"
))
{
enableMultiWeChat();
ShellExecute(NULL, NULL, WeChatPath, NULL, NULL, SW_NORMAL);
return
TRUE;
}
}
::MessageBox(NULL, L
"执行失败!"
, L
"错误提示"
, MB_ICONERROR|MB_OK);
return
FALSE;
}