// Create the command to show on the Integration settings page LPCWSTR CreateCommand(CEStr& rsReady) { rsReady = L""; for (INT_PTR i = 0; i < ourSwitches.size(); i++) { Switch* ps = ourSwitches[i]; _ASSERTE(ps && !ps->szSwitch.IsEmpty()); bool bOpt = !ps->szOpt.IsEmpty(); bool bQuot = (bOpt && IsQuotationNeeded(ps->szOpt)); lstrmerge(&rsReady.ms_Val, ps->szSwitch, bOpt ? L" " : NULL, bQuot ? L"\"" : NULL, bOpt ? ps->szOpt.c_str() : NULL, bQuot ? L"\" " : L" "); } if (!rsReady.IsEmpty() || bCmdList) { lstrmerge(&rsReady.ms_Val, bCmdList ? L"-runlist " : L"-run ", szCmd); } else { rsReady.Set(szCmd); } return rsReady.c_str(L""); };
wchar_t* MergeCmdLine(LPCWSTR asExe, LPCWSTR asParams) { bool bNeedQuot = IsQuotationNeeded(asExe); if (asParams && !*asParams) asParams = NULL; wchar_t* pszRet; if (bNeedQuot) pszRet = lstrmerge(L"\"", asExe, asParams ? L"\" " : L"\"", asParams); else pszRet = lstrmerge(asExe, asParams ? L" " : NULL, asParams); return pszRet; }
void CSetPgIntegr::RegisterShell(LPCWSTR asName, LPCWSTR asMode, LPCWSTR asConfig, LPCWSTR asCmd, LPCWSTR asIcon) { if (!asName || !*asName) asName = L"ConEmu"; if (!asCmd || !*asCmd) asCmd = CONEMU_HERE_CMD; asCmd = SkipNonPrintable(asCmd); #ifdef _DEBUG CEStr szMode(asMode); _ASSERTE(szMode.IsSwitch(L"-here") || szMode.IsSwitch(L"-inside") || szMode.IsSwitch(L"-inside:")); #endif CEStr lsExta; LPCWSTR pszExtraArgs = gpConEmu->MakeConEmuStartArgs(lsExta, asConfig); size_t cchMax = _tcslen(gpConEmu->ms_ConEmuExe) + (asMode ? (_tcslen(asMode) + 3) : 0) + (pszExtraArgs ? (_tcslen(pszExtraArgs) + 1) : 0) + _tcslen(asCmd) + 32; wchar_t* pszCmd = (wchar_t*)malloc(cchMax*sizeof(*pszCmd)); if (!pszCmd) return; //[HKEY_CURRENT_USER\Software\Classes\*\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\*\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /cmd {powershell} -cur_console:n" //[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /cmd {powershell} -cur_console:n" //[HKEY_CURRENT_USER\Software\Classes\Directory\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\Directory\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /dir \"%1\" /cmd {powershell} -cur_console:n" //[HKEY_CURRENT_USER\Software\Classes\Drive\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\Drive\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /dir \"%1\" /cmd {powershell} -cur_console:n" int iSucceeded = 0; bool bHasLibraries = IsWindows7; for (int i = 1; i <= 6; i++) { _wcscpy_c(pszCmd, cchMax, L"\""); _wcscat_c(pszCmd, cchMax, gpConEmu->ms_ConEmuExe); _wcscat_c(pszCmd, cchMax, L"\" "); // `-here`, `-inside` or `-inside:cd ...` if (asMode && *asMode) { bool bQ = IsQuotationNeeded(asMode); if (bQ) _wcscat_c(pszCmd, cchMax, L"\""); _wcscat_c(pszCmd, cchMax, asMode); _wcscat_c(pszCmd, cchMax, bQ ? L"\" " : L" "); } // -FontDir, -LoadCfgFile, -Config, etc. if (pszExtraArgs && *pszExtraArgs) { _wcscat_c(pszCmd, cchMax, pszExtraArgs); _wcscat_c(pszCmd, cchMax, L" "); } LPCWSTR pszRoot = NULL; switch (i) { case 1: pszRoot = L"Software\\Classes\\*\\shell"; break; case 2: pszRoot = L"Software\\Classes\\Directory\\Background\\shell"; break; case 3: if (!bHasLibraries) continue; pszRoot = L"Software\\Classes\\LibraryFolder\\Background\\shell"; break; case 4: pszRoot = L"Software\\Classes\\Directory\\shell"; _wcscat_c(pszCmd, cchMax, L"-dir \"%1\" "); break; case 5: pszRoot = L"Software\\Classes\\Drive\\shell"; _wcscat_c(pszCmd, cchMax, L"-dir \"%1\" "); break; case 6: // Issue 1191: ConEmu was launched instead of explorer from taskbar pinned library icon continue; //if (!bHasLibraries) // continue; //pszRoot = L"Software\\Classes\\LibraryFolder\\shell"; //_wcscat_c(pszCmd, cchMax, L"-dir \"%1\" "); //break; } bool bCmdKeyExist = false; if (*asCmd == L'/') { CEStr lsArg; LPCWSTR pszTemp = asCmd; while (0 == NextArg(&pszTemp, lsArg)) { if (lsArg.OneOfSwitches(L"-run",L"-runlist",L"-cmd",L"-cmdlist")) { bCmdKeyExist = true; break; } } } if (!bCmdKeyExist) _wcscat_c(pszCmd, cchMax, L"-run "); _wcscat_c(pszCmd, cchMax, asCmd); HKEY hkRoot; if (0 == RegCreateKeyEx(HKEY_CURRENT_USER, pszRoot, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkRoot, NULL)) { HKEY hkConEmu; if (0 == RegCreateKeyEx(hkRoot, asName, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkConEmu, NULL)) { // Если задана "иконка" if (asIcon) RegSetValueEx(hkConEmu, L"Icon", 0, REG_SZ, (LPBYTE)asIcon, (lstrlen(asIcon)+1)*sizeof(*asIcon)); else RegDeleteValue(hkConEmu, L"Icon"); // Команда HKEY hkCmd; if (0 == RegCreateKeyEx(hkConEmu, L"command", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkCmd, NULL)) { if (0 == RegSetValueEx(hkCmd, NULL, 0, REG_SZ, (LPBYTE)pszCmd, (lstrlen(pszCmd)+1)*sizeof(*pszCmd))) iSucceeded++; RegCloseKey(hkCmd); } RegCloseKey(hkConEmu); } RegCloseKey(hkRoot); } } free(pszCmd); }