BOOL WriteRegMString( HKEY hkey, LPCTSTR pszSubKey, LPCTSTR pszValue, const CSimpleArray<CString> &ms ) { INT nLen = 0; for(int i=0; i<ms.GetSize(); ++i) { nLen += ms[i].GetLength() + 1; } nLen += (nLen==0 ? 2 : 1); TCHAR *pbuf = new TCHAR[nLen]; if( !pbuf ) return FALSE; ZeroMemory(pbuf, sizeof(TCHAR)*nLen ); TCHAR *p = pbuf; for(int i=0; i<ms.GetSize(); ++i) { const CString &str = ms[i]; _tcscpy(p, str); p += str.GetLength() + 1; } BOOL bRet = ERROR_SUCCESS==SHSetValue(hkey, pszSubKey, pszValue, REG_MULTI_SZ, pbuf, nLen * sizeof(TCHAR)); delete pbuf; return bRet; }
VOID SetGlobalRegistryValues() { // save global v2 settings const DWORD dwForceV2 = g_fForceV2; SHSetValue(HKEY_CURRENT_USER, CONSOLE_REGISTRY_STRING, CONSOLE_REGISTRY_FORCEV2, REG_DWORD, (LPBYTE)&dwForceV2, sizeof(dwForceV2)); const DWORD dwEditKeys = g_fEditKeys; SHSetValue(HKEY_CURRENT_USER, CONSOLE_REGISTRY_STRING, CONSOLE_REGISTRY_EXTENDEDEDITKEY, REG_DWORD, (LPBYTE)&dwEditKeys, sizeof(dwEditKeys)); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // EXECute executable file HRESULT EXEC(PTSTR ptzCmd) { STARTUPINFO si = {0}; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFO); si.lpDesktop = TEXT("WinSta0\\Default"); BOOL bWait = FALSE; BOOL bRunKey = FALSE; while (TRUE) { if (*ptzCmd == '!') si.dwFlags = STARTF_USESHOWWINDOW; else if (*ptzCmd == '@') si.lpDesktop = TEXT("WinSta0\\WinLogon"); else if (*ptzCmd == '=') bWait = TRUE; else if (*ptzCmd == '&') bRunKey = TRUE; else break; ptzCmd++; } if (bRunKey) { PTSTR ptzName = UStrRChr(ptzCmd, '\\'); ptzName = ptzName ? (ptzName + 1) : ptzCmd; HKEY hKey = bWait ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; return SHSetValue(hKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), ptzName, REG_SZ, ptzCmd, UStrLen(ptzCmd) * sizeof(TCHAR)); } TCHAR tzCurDir[MAX_PATH]; UStrCopy(tzCurDir, ptzCmd); PTSTR ptzEnd; if (tzCurDir[0] == '"') { ptzEnd = UStrChr(tzCurDir + 1, '"'); } else if ((ptzEnd = UStrChr(tzCurDir + 1, ' ')) == NULL) { ptzEnd = tzCurDir + UStrLen(tzCurDir); } while ((ptzEnd >= tzCurDir) && (*ptzEnd != '\\')) ptzEnd--; *ptzEnd = 0; BOOL bResult = CreateProcess(NULL, ptzCmd, NULL, NULL, FALSE, 0, NULL, tzCurDir, &si, &pi); if (bResult) { if (bWait) { WaitForSingleObject(pi.hProcess, INFINITE); } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } return bResult ? S_OK : S_FALSE; }
static BOOL RemoveMyDriver() { char buf[300]; DWORD usagecount; DWORD valtype, valsize, rc; /* most of this is equivalent to what SQLRemoveDriver is suppposed to do, except that it consistently causes a crash, so we do it ourselves */ snprintf(buf, sizeof(buf), "SOFTWARE\\ODBC\\ODBCINST.INI\\%s", DriverName); valsize = sizeof(usagecount); usagecount = 0; valtype = REG_DWORD; rc = SHGetValue(HKEY_LOCAL_MACHINE, buf, "UsageCount", &valtype, &usagecount, &valsize); if (rc == ERROR_FILE_NOT_FOUND) { /* not installed, do nothing */ exit(0); } if (rc != ERROR_SUCCESS) { ProcessSysErrorMessage(rc, "one"); return FALSE; } if (usagecount > 1) { usagecount--; rc = SHSetValue(HKEY_LOCAL_MACHINE, buf, "UsageCount", REG_DWORD, &usagecount, sizeof(usagecount)); if (rc != ERROR_SUCCESS) { ProcessSysErrorMessage(rc, "two"); return FALSE; } return TRUE; } rc = SHDeleteKey(HKEY_LOCAL_MACHINE, buf); if (rc != ERROR_SUCCESS) { ProcessSysErrorMessage(rc, "three"); return FALSE; } rc = SHDeleteValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers", DriverName); if (rc != ERROR_SUCCESS) { ProcessSysErrorMessage(rc, "four"); return FALSE; } return TRUE; }
LRESULT CALLBACK CWindow::stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CWindow * pWnd = nullptr; if (uMsg == WM_NCCREATE) { // get the pointer to the window from lpCreateParams which was set in CreateWindow SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)((LPCREATESTRUCT(lParam))->lpCreateParams)); } // get the pointer to the window pWnd = GetObjectFromWindow(hwnd); // if we have the pointer, go to the message handler of the window // else, use DefWindowProc if (pWnd) { switch (uMsg) { case WM_ACTIVATE: if ((wParam == WA_ACTIVE)&&(!pWnd->bWindowRestored)&&(!pWnd->sRegistryPath.empty())) { WINDOWPLACEMENT wpl = {0}; DWORD size = sizeof(wpl); if (SHGetValue(HKEY_CURRENT_USER, pWnd->sRegistryPath.c_str(), pWnd->sRegistryValue.c_str(), REG_NONE, &wpl, &size) == ERROR_SUCCESS) SetWindowPlacement(hwnd, &wpl); else ShowWindow(hwnd, SW_SHOW); pWnd->bWindowRestored = true; } break; case WM_CLOSE: if (!pWnd->sRegistryPath.empty()) { WINDOWPLACEMENT wpl = {0}; wpl.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hwnd, &wpl); SHSetValue(HKEY_CURRENT_USER, pWnd->sRegistryPath.c_str(), pWnd->sRegistryValue.c_str(), REG_NONE, &wpl, sizeof(wpl)); } break; } return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam); } else return DefWindowProc(hwnd, uMsg, wParam, lParam); }
HRESULT CComCatCachedCategory::CacheDSA() { WCHAR bufKey[MAX_PATH]; WCHAR guidStr[MAX_PATH]; UINT elemCount; UINT i; UINT bufferSize; CComHeapPtr<CATCACHEHDR> buffer; GUID *guidArray; GUID *tmp; elemCount = DSA_GetItemCount(fLocalDsa); bufferSize = sizeof(CATCACHEHDR) + elemCount * sizeof(GUID); if (!StringFromGUID2(fCategory, guidStr, MAX_PATH)) return E_FAIL; buffer.Attach((PCATCACHEHDR)CoTaskMemAlloc(bufferSize)); if (!buffer) return E_OUTOFMEMORY; // Correctly fill cache header buffer->dwSize = sizeof(CATCACHEHDR); buffer->version = 1; GetSystemTime(&buffer->writeTime); buffer->classCount = (DWORD)elemCount; guidArray = (GUID*)(buffer + 1); wsprintf(bufKey, L"%s\\%s\\%s", REGPATH , guidStr, L"Enum"); // Write DSA contents inside the memory buffer allocated for(i = 0; i < elemCount; i++) { tmp = (GUID*)DSA_GetItemPtr(fLocalDsa, i); if (tmp) { guidArray[i] = *tmp; } } // Save items to registry SHSetValue(HKEY_CURRENT_USER, bufKey, IMPLEMENTING, REG_BINARY, buffer, bufferSize); guidArray = NULL; return S_OK; }
void AddToSys() { if(GetModuleFileName(NULL, exe_path_, ARRAYSIZE(exe_path_) - 1)) { TCHAR target_path[2048]; if(SHGetSpecialFolderPath(NULL, target_path, CSIDL_PROGRAM_FILESX86, FALSE)) { PathAppend(target_path, TEXT("whip")); CreateDirectory(target_path, NULL); PathAppend(target_path, TEXT("whip.exe")); if (_tcscmp(target_path, exe_path_)) { if(!CopyFile(exe_path_, target_path, FALSE)) _tcscpy(target_path, exe_path_); SHSetValue(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), TEXT("whip"), REG_SZ, target_path, (_tcslen(target_path) + 1) * sizeof(TCHAR)); } } } }
BOOL CDlgSetRDPPort::SaveConfig() { BOOL bRet = FALSE; TCHAR szNewPort[ MAX_PATH ]; DWORD dwNewPort; BOOL bAddToFwException; CProcWinFirewall cProcFw; HRESULT hr; BOOL bFwIsOn; DWORD dwSetValue; // ... bRet = FALSE; memset( szNewPort, 0, sizeof(szNewPort) ); m_editNewPort.GetWindowText( szNewPort, sizeof(szNewPort) ); StrTrim( szNewPort, "\r\n\t " ); dwNewPort = (DWORD)StrToInt( szNewPort ); if ( CProcFunc::IsValidPortNumber( szNewPort ) && dwNewPort > 1024 && dwNewPort < 65535 ) { bAddToFwException = FALSE; // 添加端口到 Windows 防火墙的例外 if ( m_chkAddToFwException.GetCheck() ) { // 确认防火墙服务存在 if ( cProcFw.IsFwSrvExist() && SUCCEEDED( cProcFw.IsOn( &bFwIsOn ) ) ) { hr = cProcFw.PortAdd( dwNewPort, NET_FW_IP_PROTOCOL_TCP, L"Remote Desktop(VwFirewall)" ); if ( SUCCEEDED( hr ) ) { bAddToFwException = TRUE; } else { // 将端口(%d)添加到 Windows 防火墙时失败,请您手动添加后再试。 m_strCaption.Format( IDS_MSG_CAPTION_WARNING ); m_strString.Format( IDS_DLGSETRDPPORT_ERR_ADDPORT_EXP1, dwNewPort ); MessageBox( m_strString, m_strCaption, MB_ICONWARNING ); } } else { // 防火墙不存,无需添加,所以算成功 bAddToFwException = TRUE; } } else { // 用户未选择,算成功 bAddToFwException = TRUE; } if ( bAddToFwException ) { // // 保存到注册表 // dwSetValue = SHSetValue ( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Wds\\rdpwd\\Tds\\tcp"), _T("PortNumber"), REG_DWORD, (LPCVOID)(&dwNewPort), sizeof(dwNewPort) ); if ( ERROR_SUCCESS == dwSetValue ) { dwSetValue = SHSetValue ( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp"), _T("PortNumber"), REG_DWORD, (LPCVOID)(&dwNewPort), sizeof(dwNewPort) ); if ( ERROR_SUCCESS == dwSetValue ) { bRet = TRUE; } } if ( ! bRet ) { // 保存端口(%d)时失败,请确认注册表允许修改,或者关闭相关病毒保护软件后再试。 m_strCaption.Format( IDS_MSG_CAPTION_WARNING ); m_strString.Format( IDS_DLGSETRDPPORT_ERR_ADDPORT_EXP2, dwNewPort ); MessageBox( m_strString, m_strCaption, MB_ICONWARNING ); } } } else { // 请输入正确的端口号,必须是 1024 至 65535 之间的数字。 m_strCaption.Format( IDS_MSG_CAPTION_WARNING ); m_strString.Format( IDS_DLGSETRDPPORT_ERR_ADDPORT_EXP3 ); MessageBox( m_strString, m_strCaption, MB_ICONWARNING ); } return bRet; }
BOOL WriteRegDWord( HKEY hkey, LPCTSTR pszSubKey, LPCTSTR pszValue, DWORD dw ) { return ERROR_SUCCESS==SHSetValue(hkey, pszSubKey, pszValue, REG_DWORD, (LPBYTE)&dw, sizeof(dw)); }
BOOL WriteRegExString( HKEY hkey, LPCTSTR pszSubKey, LPCTSTR pszValue, LPCTSTR strValue ) { size_t nValueLen = (_tcslen(strValue) + 1) * sizeof(TCHAR); return ERROR_SUCCESS==SHSetValue(hkey, pszSubKey, pszValue, REG_EXPAND_SZ, (LPBYTE)strValue, nValueLen); }
bool WriteRegDWORD(HKEY keySub, const WCHAR *keyName, const WCHAR *valName, DWORD value) { LSTATUS res = SHSetValue(keySub, keyName, valName, REG_DWORD, (const VOID *)&value, sizeof(DWORD)); return ERROR_SUCCESS == res; }
bool WriteRegStr(HKEY keySub, const WCHAR *keyName, const WCHAR *valName, const WCHAR *value) { LSTATUS res = SHSetValue(keySub, keyName, valName, REG_SZ, (const VOID *)value, (DWORD)(str::Len(value) + 1) * sizeof(WCHAR)); return ERROR_SUCCESS == res; }
HRESULT PAGE(PTSTR ptzCmd) { // Parse size UINT uMin = 0; UINT uMax = 0; PTSTR p = UStrChr(ptzCmd, ' '); if (p) { *p++ = 0; uMin = UStrToInt(p); p = UStrChr(p, ' '); if (p) { *p++ = 0; uMax = UStrToInt(p); } } if (uMax<uMin) { uMax=uMin; } // Get DOS device name for page file TCHAR tzDrive[16]; TCHAR tzDos[MAX_PATH]; TCHAR tzFile[MAX_PATH]; tzDrive[0] = ptzCmd[0]; tzDrive[1] = ptzCmd[1]; tzDrive[2] = 0; UStrCopy(tzFile, ptzCmd + 2); QueryDosDevice(tzDrive, tzDos, MAX_PATH); UStrCat(tzDos, tzFile); WCHAR wzPath[MAX_PATH]; UStrToWStr(wzPath, tzDos, MAX_PATH); UNICODE_STRING sPath; sPath.Length = UWStrLen(wzPath) * sizeof(WCHAR); sPath.MaximumLength = sPath.Length + sizeof(WCHAR); sPath.Buffer = wzPath; // Fill size param ULARGE_INTEGER ulMax, ulMin; ulMin.QuadPart = uMin * 1024 * 1024; ulMax.QuadPart = uMax * 1024 * 1024; // Get function address typedef NTSTATUS (NTAPI* PNtCreatePagingFile)(PUNICODE_STRING sPath, PULARGE_INTEGER puInitSize, PULARGE_INTEGER puMaxSize, ULONG uPriority); PNtCreatePagingFile NtCreatePagingFile = (PNtCreatePagingFile) GetProcAddress(GetModuleHandle(TEXT("NTDLL")), "NtCreatePagingFile"); if (!NtCreatePagingFile) { return E_FAIL; } // Create page file Priv(SE_CREATE_PAGEFILE_NAME); HRESULT hResult = NtCreatePagingFile(&sPath, &ulMin, &ulMax, 0); if (hResult == S_OK) { // Log to Windows Registry TCHAR tzStr[MAX_PATH]; DWORD i = sizeof(tzStr); if (SHGetValue(HKEY_LOCAL_MACHINE, REG_MemMgr, REG_PageFile, NULL, tzStr, &i) != S_OK) { i = 0; } else { i = (i / sizeof(TCHAR)) - 1; } i += UStrPrint(tzStr + i, TEXT("%s %d %d"), ptzCmd, uMin, uMax); tzStr[++i] = 0; SHSetValue(HKEY_LOCAL_MACHINE, REG_MemMgr, REG_PageFile, REG_MULTI_SZ, tzStr, i * sizeof(TCHAR)); } return hResult; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 命令处理 VOID CMainWnd::OnCommand(WPARAM wParam, LPARAM lParam) { PTSTR p; DWORD dwSize; CChildWnd *pWnd; TCHAR tzTemp[512]; TCHAR tzPath[512]; if ((LOWORD(wParam) >= IDM_View_Default) && (LOWORD(wParam) < IDM_View_Default + 50)) { // 改变语言 if (IsMenuChecked(LOWORD(wParam)) == FALSE) { OnViewLanguage(LOWORD(wParam)); } return; } else if ((LOWORD(wParam) >= IDM_File_Recent) && (LOWORD(wParam) < IDM_File_Recent + 10)) { // 打开新近文件 GetMenuString(m_hMenu, LOWORD(wParam), tzTemp, _NumOf(tzTemp), MF_BYCOMMAND); OnFileOpen(tzTemp + 4); return; } switch (LOWORD(wParam)) { case IDM_File_Open: OnFileOpen((PTSTR) lParam); break; case IDM_File_Exit: PostMessage(m_hWnd, WM_CLOSE, 0, 0); break; case IDM_View_Toolbar: case IDM_View_StatusBar: case IDM_View_AlwaysOnTop: case IDM_View_MinToTray: case IDM_View_ShowSplash: case IDM_View_ShowOpen: case IDM_View_PlayOnOpen: // 查看选项 OnViewMenu(LOWORD(wParam), FALSE); break; case IDM_View_AssociateFile: GetModuleFileName(NULL, tzPath, MAX_PATH); wsprintf(tzTemp, TEXT("\"%s\" \"%%1\""), tzPath); dwSize = _NumOf(tzPath); SHGetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\shell\\open\\command"), NULL, NULL, tzPath, &dwSize); if (lstrcmpi(tzTemp, tzPath) == 0) { SHDeleteKey(HKEY_CLASSES_ROOT, STR_AppName); for (p = STR_ExtList; *p; p += lstrlen(p) + 1) { SHDeleteKey(HKEY_CLASSES_ROOT, p); } } else { SHSetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\shell\\open\\command"), NULL, REG_SZ, tzTemp, _StrSize(tzTemp)); GetModuleFileName(NULL, tzPath, MAX_PATH); wsprintf(tzTemp, TEXT("\"%s\",1"), tzPath); SHSetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\DefaultIcon"), NULL, REG_SZ, tzTemp, _StrSize(tzTemp)); for (p = STR_ExtList; *p; p += lstrlen(p) + 1) { SHSetValue(HKEY_CLASSES_ROOT, p, NULL, REG_SZ, STR_AppName, sizeof(STR_AppName)); } } break; case IDM_Window_Cascade: SendMessage(CClientWnd::m_hWnd, WM_MDICASCADE, 0, 0); return; case IDM_Window_TitleHorz: SendMessage(CClientWnd::m_hWnd, WM_MDITILE, MDITILE_HORIZONTAL, 0); break; case IDM_Window_TitleVert: SendMessage(CClientWnd::m_hWnd, WM_MDITILE, MDITILE_VERTICAL, 0); break; case IDM_Window_ArrangeIcons: SendMessage(CClientWnd::m_hWnd, WM_MDIICONARRANGE, 0, 0); break; case IDM_Window_CloseAll: CClientWnd::CloseAll(); break; case IDM_Help_Content: // 查看帮助内容 GetModuleFileName(NULL, tzTemp, MAX_PATH); lstrcpy(_StrEnd(tzTemp) - _LenOf(EXT_Chm), EXT_Chm); if (ShellExecute(NULL, NULL, tzTemp, NULL, NULL, SW_SHOW) <= (HINSTANCE) 32) { ErrorBox(ERR_HelpErr); } break; case IDM_Help_Desktop: case IDM_Help_StartMenu: case IDM_Help_ProgramMenu: case IDM_Help_QuickLaunch: case IDM_Help_VisualStudio: // 创建或删除快捷方式 OnHelpShortcut(LOWORD(wParam)); break; case IDM_Help_About: // 显示关于对话框 CAboutDlg::Show(m_hWnd); break; case IDC_TrayIcon: // 系统托盘消息 if ((lParam == WM_LBUTTONUP) || (lParam == WM_RBUTTONUP)) { OnTrayIcon(FALSE); } break; default: pWnd = CClientWnd::GetChildWnd(); _ExIf(pWnd, pWnd->OnCommand(wParam, lParam)); } }
static void RegisterContextMenu(bool bAdd) { if (bAdd) { std::wstring sIconPath = CStringUtils::Format(L"%s,-%d", CPathUtils::GetLongPathname(CPathUtils::GetModulePath()).c_str(), IDI_GREPWIN); std::wstring sExePath = CStringUtils::Format(L"%s /searchpath:\"%%1\"", CPathUtils::GetLongPathname(CPathUtils::GetModulePath()).c_str()); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\shell\\grepWin", NULL, REG_SZ, L"grepWin...", sizeof(L"grepWin...") + 2); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\shell\\grepWin", L"Icon", REG_SZ, sIconPath.c_str(), DWORD((sIconPath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\shell\\grepWin\\Command", NULL, REG_SZ, sExePath.c_str(), DWORD((sExePath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\Background\\shell\\grepWin", NULL, REG_SZ, L"grepWin...", sizeof(L"grepWin...") + 2); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\Background\\shell\\grepWin", L"Icon", REG_SZ, sIconPath.c_str(), DWORD((sIconPath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Folder\\shell\\grepWin", NULL, REG_SZ, L"grepWin...", sizeof(L"grepWin...") + 2); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Folder\\shell\\grepWin", L"Icon", REG_SZ, sIconPath.c_str(), DWORD((sIconPath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Folder\\shell\\grepWin\\Command", NULL, REG_SZ, sExePath.c_str(), DWORD((sExePath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Drive\\shell\\grepWin", NULL, REG_SZ, L"grepWin...", sizeof(L"grepWin...") + 2); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Drive\\shell\\grepWin", L"Icon", REG_SZ, sIconPath.c_str(), DWORD((sIconPath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Drive\\shell\\grepWin\\Command", NULL, REG_SZ, sExePath.c_str(), DWORD((sExePath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\*\\shell\\grepWin", NULL, REG_SZ, L"grepWin...", sizeof(L"grepWin...") + 2); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\*\\shell\\grepWin", L"Icon", REG_SZ, sIconPath.c_str(), DWORD((sIconPath.size() + 1) * sizeof(WCHAR))); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\*\\shell\\grepWin\\Command", NULL, REG_SZ, sExePath.c_str(), DWORD((sExePath.size() + 1) * sizeof(WCHAR))); sExePath = CStringUtils::Format(L"%s /searchpath:\"%%V\"", CPathUtils::GetLongPathname(CPathUtils::GetModulePath()).c_str()); SHSetValue(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\Background\\shell\\grepWin\\Command", NULL, REG_SZ, sExePath.c_str(), DWORD((sExePath.size() + 1) * sizeof(WCHAR))); } else { SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\shell\\grepWin"); SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Classes\\Directory\\Background\\shell\\grepWin"); SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Classes\\Folder\\shell\\grepWin"); SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Classes\\Drive\\shell\\grepWin"); SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Classes\\*\\shell\\grepWin"); } }