void InstanceManager::Write() { // Remove all existing instances from the registry HKEY nuttray; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, INSTANCES_KEY, 0, KEY_READ|KEY_WRITE, &nuttray) == ERROR_SUCCESS) { // Iterate though all nuttray keys locating instance keys of the form // "instanceN". Add the id of each key to a list. We don't want to // remove keys while we're enumerating them since Win32 docs say to not // change the key while enumerating it. int i = 0; TCHAR name[128]; DWORD len = sizeof(name); list<LPCWSTR> ids; while (RegEnumKeyEx(nuttray, i++, name, &len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { ids.push_back(name); len = sizeof(name); } // Now that we have a list of all ids, loop thru and delete each one list<LPCWSTR>::iterator iter; for (iter = ids.begin(); iter != ids.end(); ++iter) RegDeleteKey(nuttray, *iter); } else { // No nuttray\instances key (and therefore no instances) yet if (RegCreateKey(HKEY_LOCAL_MACHINE, INSTANCES_KEY, &nuttray) != ERROR_SUCCESS) return; } // Write out instances. Our instance list is in sorted order but may // have gaps in the numbering, so regenerate 'order' value, ignoring what's // in the InstanceConfig.order field. int count = 0; list<InstanceConfig>::iterator iter; for (iter = _instances.begin(); iter != _instances.end(); ++iter) { // Create the instance and populate it HKEY instkey; if (RegCreateKeyA(nuttray, iter->mcfg.id.c_str(), &instkey) == ERROR_SUCCESS) { RegSetString(instkey, "host", iter->mcfg.host); RegSetDWORD(instkey, "port", iter->mcfg.port); RegSetDWORD(instkey, "refresh", iter->mcfg.refresh); RegSetDWORD(instkey, "popups", iter->mcfg.popups); RegSetDWORD(instkey, "order", count); RegCloseKey(instkey); count++; } } RegCloseKey(nuttray); }
void InstanceManager::SetAutoStart(bool start) { HKEY runkey= 0; if (start) { // Get the full path/filename of this executable char path[1024]; GetModuleFileNameA(NULL, path, sizeof(path)); // Add double quotes char cmd[1024]; snprintf(cmd, sizeof(cmd), "\"%s\"", path); // Open registry key for auto-run programs if (RegCreateKey(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), &runkey) != ERROR_SUCCESS) { return; } // Add nuttray key RegSetString(runkey, "Apctray", cmd); } else { // Open registry key nuttray HKEY runkey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_READ|KEY_WRITE, &runkey) == ERROR_SUCCESS) { RegDeleteValue(runkey, TEXT("Apctray")); } } RegCloseKey(runkey); }
STDAPI DllRegisterServer(void) { //register server WCHAR path[MAX_PATH]; GetModuleFileName(g_hMod, path, MAX_PATH); auto ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\InprocServer32", NULL, path); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\InprocServer32", L"ThreadingModel", L"Apartment"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\ProgID", NULL, L"CircleControl.CircleControl.1"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\VersionIndependentProgID", NULL, L"CircleControl.CircleControl"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\TypeLib", NULL, L"{E9D304EC-552C-4D89-9804-7AB9E45FEF32}"); if (!ret) return E_FAIL; HKEY hKey = NULL; auto hr = RegCreateKeyEx(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\Programmable", NULL, NULL, NULL, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (hr != ERROR_SUCCESS) return hr; hr = RegCreateKeyEx(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\Control", NULL, NULL, NULL, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (hr != ERROR_SUCCESS) return hr; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\Version", NULL, L"1.0"); if (!ret) return E_FAIL; WCHAR pathRsrc[MAX_PATH + 100]; StringCchPrintf(pathRsrc, MAX_PATH + 100, L"%s, 101", path); hr = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\ToolboxBitmap32", NULL, pathRsrc); if (hr != ERROR_SUCCESS) return hr; ret = RegSetString(HKEY_CLASSES_ROOT, L"CircleControl.CircleControl.1\\CLSID", NULL, L"{1C797BFB-3F97-4CF8-B857-45C90028759B}"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CircleControl.CircleControl\\CLSID", NULL, L"{1C797BFB-3F97-4CF8-B857-45C90028759B}"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CircleControl.CircleControl\\CurVer", NULL, L"CircleControl.CircleControl.1"); if (!ret) return E_FAIL; //register the typelib HRSRC hrsrc = FindResource(g_hMod, MAKEINTRESOURCE(1), L"TYPELIB"); if (!hrsrc) return E_FAIL; HGLOBAL hGlobal = LoadResource(g_hMod, hrsrc); if (!hGlobal) return E_FAIL; auto size = SizeofResource(g_hMod, hrsrc); WCHAR tempDir[MAX_PATH]; GetTempPath(MAX_PATH, tempDir); WCHAR tempFile[MAX_PATH]; GetTempFileName(tempDir, L"keke", 0, tempFile); HANDLE hFile = CreateFile(tempFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL); if (hFile == INVALID_HANDLE_VALUE) return E_FAIL; DWORD byteCount; if (!WriteFile(hFile, hGlobal, size, &byteCount, NULL) || byteCount != size) return E_FAIL; if (!CloseHandle(hFile)) return E_FAIL; ITypeLib* typeLib = nullptr; hr = LoadTypeLib(tempFile, &typeLib); if (hr != S_OK) { return hr; } hr = RegisterTypeLib(typeLib, path, NULL); return hr; }