REG_OPTION_NON_VOLATILE

本文详细解释了在Windows注册表操作中两个关键选项的区别:REG_OPTION_NON_VOLATILE和REG_OPTION_VOLATILE。通过RegCreateKeyEx函数的使用,了解创建永久注册表项与临时注册表项的不同行为,以及它们如何影响注册表信息的持久性。
部署运行你感兴趣的模型镜像

REG_OPTION_NON_VOLATILE:

该宏是RegCreateKeyEx函数的参数可选项。

LONG RegCreateKeyEx( HKEY hKey,

LPCWSTR lpSubKey,

DWORD Reserved,

LPWSTR lpClass,

DWORD dwOptions,

REGSAM samDesired,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

PHKEY phkResult,

LPDWORD lpdwDisposition );

看看MSDN对它的说明:

Default setting. All registry keys are created as non-volatile and the information stored in memory is preserved when the OS is restarted. The RegSaveKey function saves keys that are non-volatile.

翻译:默认设置。所有注册表项创建作为非易失性和操作系统重新启动时保留在内存中存储的信息。 RegSaveKey功能键是非易失性保存。

意思是说如果参数dwOptions选择REG_OPTION_NON_VOLATILE,则通过RegCreateKeyEx创建的注册表是永久的,不会因为计算机的重启而消失。相反参数选择REG_OPTION_VOLATILE,则表明创建的注册表是临时的,计算机重启后该注册表不存在。

dwOptions [in] Registry key options. The following table shows the possible values for this parameter.
ValueDescription
REG_OPTION_NON_VOLATILEDefault setting. All registry keys are created as non-volatile and the information stored in memory is preserved when the OS is restarted. The RegSaveKey function saves keys that are non-volatile.
REG_OPTION_VOLATILEAll registry keys are created as volatile, and the information is stored in memory and is not preserved when the corresponding registry hive is unloaded. For HKEY_LOCAL_MACHINE, this occurs when the OS is shut down. The RegSaveKey function does not save volatile registry keys. This flag is ignored for keys that already exist.

参考资料:http://msdn.microsoft.com/en-us/library/ms891450.aspx

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

void CRuoHaiDrawDwSetupChildPage::OnBnClickedWallisfkNoBtn() { // TODO: 在此添加控件通知处理程序代码 // 围墙是否封口 data_.bWallIsYesNo = bWallIsYesNo_ = 0; //((CButton*)GetDlgItem(IDC_WALLISFK_NO_BTN))->SetWindowText(_T("否")); //((CButton*)GetDlgItem(IDC_WALLISFK_YES_BTN))->SetWindowText(_T("是")); HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bWallIsYesNo_KeyName, bWallIsYesNo_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bWallIsYesNo_KeyName, bWallIsYesNo_); } void CRuoHaiDrawDwSetupChildPage::OnBnClickedWallisfkYesBtn() { // TODO: 在此添加控件通知处理程序代码 // 围墙是否封口 //((CButton*)GetDlgItem(IDC_WALLISFK_NO_BTN))->SetWindowText(_T("否")); //((CButton*)GetDlgItem(IDC_WALLISFK_YES_BTN))->SetWindowText(_T("是")); data_.bWallIsYesNo = bWallIsYesNo_ = 1; HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bWallIsYesNo_KeyName, bWallIsYesNo_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bWallIsYesNo_KeyName, bWallIsYesNo_); } void CRuoHaiDrawDwSetupChildPage::OnBnClickedWallBlockBtn() { // TODO: 在此添加控件通知处理程序代码 //((CButton*)GetDlgItem(IDC_WALL_BLOCK_BTN))->SetWindowText(_T("方块")); //((CButton*)GetDlgItem(IDC_WALL_LINE_BTN))->SetWindowText(_T("短线")); // 围墙符号样式 data_.bWallStyle = bWallStyle_ = 0; HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bWallStyle_KeyName, bWallStyle_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bWallStyle_KeyName, bWallStyle_); } void CRuoHaiDrawDwSetupChildPage::OnBnClickedWallLineBtn() { // TODO: 在此添加控件通知处理程序代码 // 围墙符号样式 //((CButton*)GetDlgItem(IDC_WALL_BLOCK_BTN))->SetWindowText(_T("方块")); //((CButton*)GetDlgItem(IDC_WALL_LINE_BTN))->SetWindowText(_T("短线")); data_.bWallStyle = bWallStyle_ = 1; HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bWallStyle_KeyName, bWallStyle_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bWallStyle_KeyName, bWallStyle_); } void CRuoHaiDrawDwSetupChildPage::OnBnClickedXiepolinetsNoBtn() { // TODO: 在此添加控件通知处理程序代码 // 坡脚线提示 //((CButton*)GetDlgItem(IDC_XIEPOLINETS_NO_BTN))->SetWindowText(_T("否")); //((CButton*)GetDlgItem(IDC_XIEPOLINETS_YES_BTN))->SetWindowText(_T("是")); data_.bXpTs = bXpTs_ = 0; HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bXpTs_KeyName, bDgLine_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bXpTs_KeyName, bDgLine_); } void CRuoHaiDrawDwSetupChildPage::OnBnClickedXiepolinetsYesBtn() { // TODO: 在此添加控件通知处理程序代码 // 坡脚线提示 //((CButton*)GetDlgItem(IDC_XIEPOLINETS_NO_BTN))->SetWindowText(_T("否")); //((CButton*)GetDlgItem(IDC_XIEPOLINETS_YES_BTN))->SetWindowText(_T("是")); data_.bXpTs = bXpTs_ = 1; HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bXpTs_KeyName, bDgLine_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bXpTs_KeyName, bDgLine_); } void CRuoHaiDrawDwSetupChildPage::OnBnClickedDianganNoBtn() { // TODO: 在此添加控件通知处理程序代码 // 电杆是否连线 //((CButton*)GetDlgItem(IDC_DIANGAN_NO_BTN))->SetWindowText(_T("否")); //((CButton*)GetDlgItem(IDC_DIANGAN_YES_BTN))->SetWindowText(_T("是")); data_.bDgLine = bDgLine_ = 0; HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bDgLine_KeyName, bXpTs_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bDgLine_KeyName, bXpTs_); } void CRuoHaiDrawDwSetupChildPage::OnBnClickedDianganYesBtn() { // TODO: 在此添加控件通知处理程序代码 // 电杆是否连线 //((CButton*)GetDlgItem(IDC_DIANGAN_NO_BTN))->SetWindowText(_T("否")); //((CButton*)GetDlgItem(IDC_DIANGAN_YES_BTN))->SetWindowText(_T("是")); data_.bDgLine = bDgLine_ = 1; HKEY rKey; DWORD result; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_DRAW_PATH, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rKey, &result) != ERROR_SUCCESS) return; RegValue_.set(rKey, DeepMap_DWDRAW_bDgLine_KeyName, bXpTs_); RegCloseKey(rKey); DbFile_->UpdateTable(DeepMap_DWDRAW_bDgLine_KeyName, bXpTs_); } 帮我检查一下怎么会把Radio Button控件上面的描述文字给改了
06-29
#include <Windows.h> #include <Wbemidl.h> #include <comdef.h> #include <WinCrypt.h> #include <string> #include <algorithm> #include <sstream> #include <vector> #include <commctrl.h> #include <iomanip> // 添加缺失的头文件 #pragma comment(lib, "wbemuuid.lib") #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "Crypt32.lib") #pragma comment(lib, "comctl32.lib") // 资源ID定义 #define IDD_MAIN_DIALOG 101 // 添加缺失的定义 #define IDC_MACHINE_CODE 1001 #define IDC_DAYS_COMBO 1002 #define IDC_REG_CODE 1003 #define IDC_GENERATE_BTN 1004 #define IDC_REGISTER_BTN 1005 #define IDC_STATUS_TEXT 1006 #define IDC_VALIDATE_BTN 1007 // 全局变量 HWND g_hMainDlg = NULL; char g_szMachineCode[256] = { 0 }; // 函数声明 const char* GetMachineCode(); const char* ComputeRegistration(const char* machineCode, int daysChoice); BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice); int ValidateLicense(); void UpdateStatus(const char* message); void InitializeControls(HWND hDlg); void GenerateRegistrationCode(HWND hDlg); void RegisterProduct(HWND hDlg); void ValidateLicenseOnStartup(); // 获取机器码函数 const char* GetMachineCode() { if (g_szMachineCode[0] != '\0') { return g_szMachineCode; } HRESULT hres; std::string serials; // 初始化COM hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { return "COM Init Failed"; } // 设置COM安全级别 hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); if (FAILED(hres)) { CoUninitialize(); return "CoInitializeSecurity Failed"; } // 创建WMI实例 IWbemLocator* pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc ); if (FAILED(hres)) { CoUninitialize(); return "WbemLocator Failed"; } // 连接到WMI IWbemServices* pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc ); if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); return "ConnectServer Failed"; } // 设置代理安全级别 hres = CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return "SetProxyBlanket Failed"; } // 查询CPU信息 IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (SUCCEEDED(hres)) { IWbemClassObject* pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) break; VARIANT vtProp; hr = pclsObj->Get(L"ProcessorId", 0, &vtProp, 0, 0); if (SUCCEEDED(hr)) { serials += _bstr_t(vtProp.bstrVal); VariantClear(&vtProp); } pclsObj->Release(); } pEnumerator->Release(); } // 查询磁盘信息 hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_DiskDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (SUCCEEDED(hres)) { IWbemClassObject* pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) break; VARIANT vtProp; hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); if (SUCCEEDED(hr)) { serials += _bstr_t(vtProp.bstrVal); VariantClear(&vtProp); } pclsObj->Release(); } pEnumerator->Release(); } // 清理资源 pSvc->Release(); pLoc->Release(); CoUninitialize(); // 生成哈希值 HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; BYTE rgbHash[16]; DWORD cbHash = 16; CHAR rgbDigits[] = "0123456789abcdef"; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { return "CryptoContext Failed"; } if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { CryptReleaseContext(hProv, 0); return "CreateHash Failed"; } if (!CryptHashData(hHash, (BYTE*)serials.c_str(), (DWORD)serials.length(), 0)) { CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return "HashData Failed"; } if (!CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) { CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return "GetHashParam Failed"; } std::string hashStr; for (DWORD i = 0; i < cbHash; i++) { char rgb[3]; sprintf_s(rgb, 3, "%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]); hashStr += rgb; } // 修正strcpy_s调用 strcpy_s(g_szMachineCode, sizeof(g_szMachineCode), hashStr.c_str()); return g_szMachineCode; } // 计算注册码函数 const char* ComputeRegistration(const char* machineCode, int daysChoice) { static char regBuffer[256] = { 0 }; std::string input = machineCode; std::string regCode; // 简单转换算法(实际应使用加密算法) for (char c : input) { regCode += (c + daysChoice) ^ 0xAA; } // 修正strcpy_s调用 strcpy_s(regBuffer, sizeof(regBuffer), regCode.c_str()); return regBuffer; } // 保存注册信息函数 BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice) { HKEY hKey; LPCSTR subKey = "Software\\MyApp\\Registration"; // 创建注册表项 if (RegCreateKeyExA(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) { return FALSE; } // 保存机器码 RegSetValueExA(hKey, "MachineCode", 0, REG_SZ, (const BYTE*)machineCode, (DWORD)strlen(machineCode) + 1); // 保存注册码 RegSetValueExA(hKey, "RegCode", 0, REG_SZ, (const BYTE*)regCode, (DWORD)strlen(regCode) + 1); // 保存授权天数 DWORD days = 0; switch (daysChoice) { case 0: days = 7; break; case 1: days = 15; break; case 2: days = 30; break; case 3: days = 0xFFFFFFFF; // 永久 } RegSetValueExA(hKey, "Days", 0, REG_DWORD, (const BYTE*)&days, sizeof(days)); // 保存激活日期 SYSTEMTIME st; GetSystemTime(&st); FILETIME ft; SystemTimeToFileTime(&st, &ft); RegSetValueExA(hKey, "ActivationDate", 0, REG_QWORD, (const BYTE*)&ft, sizeof(ft)); RegCloseKey(hKey); return TRUE; } // 验证授权函数 int ValidateLicense() { HKEY hKey; LPCSTR subKey = "Software\\MyApp\\Registration"; if (RegOpenKeyExA(HKEY_CURRENT_USER, subKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { return -1; // 未注册 } // 检查机器码是否匹配 char storedMachineCode[256] = { 0 }; DWORD size = sizeof(storedMachineCode); if (RegQueryValueExA(hKey, "MachineCode", NULL, NULL, (LPBYTE)storedMachineCode, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } if (strcmp(storedMachineCode, GetMachineCode()) != 0) { RegCloseKey(hKey); return -1; // 机器码不匹配 } // 检查授权天数 DWORD days = 0; size = sizeof(days); if (RegQueryValueExA(hKey, "Days", NULL, NULL, (LPBYTE)&days, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } // 永久授权 if (days == 0xFFFFFFFF) { RegCloseKey(hKey); return 1; } // 检查激活日期 FILETIME activationDate; size = sizeof(activationDate); if (RegQueryValueExA(hKey, "ActivationDate", NULL, NULL, (LPBYTE)&activationDate, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } // 计算已过天数 SYSTEMTIME stNow; FILETIME ftNow; GetSystemTime(&stNow); SystemTimeToFileTime(&stNow, &ftNow); ULARGE_INTEGER uAct, uNow; uAct.LowPart = activationDate.dwLowDateTime; uAct.HighPart = activationDate.dwHighDateTime; uNow.LowPart = ftNow.dwLowDateTime; uNow.HighPart = ftNow.dwHighDateTime; // 100纳秒 = 1 tick, 1天 = 864000000000 ticks ULONGLONG diff = (uNow.QuadPart - uAct.QuadPart) / 864000000000; RegCloseKey(hKey); return (diff <= days) ? 1 : 0; // 1=有效, 0=过期 } // 对话框消息处理 INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: g_hMainDlg = hDlg; InitializeControls(hDlg); ValidateLicenseOnStartup(); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_GENERATE_BTN: GenerateRegistrationCode(hDlg); break; case IDC_REGISTER_BTN: RegisterProduct(hDlg); break; case IDC_VALIDATE_BTN: ValidateLicenseOnStartup(); break; case IDCANCEL: EndDialog(hDlg, 0); return TRUE; } break; } return FALSE; } // 初始化控件 void InitializeControls(HWND hDlg) { // 设置字体 HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial"); // 获取机器码并显示 const char* mc = GetMachineCode(); SetDlgItemTextA(hDlg, IDC_MACHINE_CODE, mc); // 设置控件字体 HWND hWnd = GetDlgItem(hDlg, IDC_MACHINE_CODE); SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, TRUE); hWnd = GetDlgItem(hDlg, IDC_REG_CODE); SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, TRUE); // 初始化授权天数下拉框 HWND hCombo = GetDlgItem(hDlg, IDC_DAYS_COMBO); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"7天试用"); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"15天试用"); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"30天正式版"); SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)L"永久授权"); SendMessage(hCombo, CB_SETCURSEL, 3, 0); // 默认选择永久授权 // 设置状态文本 UpdateStatus("请选择授权类型并生成注册码"); } // 生成注册码 void GenerateRegistrationCode(HWND hDlg) { // 获取选择的授权天数 HWND hCombo = GetDlgItem(hDlg, IDC_DAYS_COMBO); int daysChoice = (int)SendMessage(hCombo, CB_GETCURSEL, 0, 0); // 计算注册码 const char* mc = GetMachineCode(); const char* regCode = ComputeRegistration(mc, daysChoice); // 显示注册码 SetDlgItemTextA(hDlg, IDC_REG_CODE, regCode); UpdateStatus("注册码已生成,点击注册按钮完成激活"); } // 注册产品 void RegisterProduct(HWND hDlg) { // 获取选择的授权天数 HWND hCombo = GetDlgItem(hDlg, IDC_DAYS_COMBO); int daysChoice = (int)SendMessage(hCombo, CB_GETCURSEL, 0, 0); // 获取注册码 char regCode[256] = { 0 }; GetDlgItemTextA(hDlg, IDC_REG_CODE, regCode, sizeof(regCode)); // 保存注册信息 const char* mc = GetMachineCode(); if (SaveRegistration(mc, regCode, daysChoice)) { UpdateStatus("产品注册成功!"); MessageBoxA(hDlg, "产品激活成功!", "注册成功", MB_OK | MB_ICONINFORMATION); } else { UpdateStatus("注册失败,请重试"); MessageBoxA(hDlg, "注册失败,请检查系统权限", "错误", MB_OK | MB_ICONERROR); } } // 验证授权 void ValidateLicenseOnStartup() { int status = ValidateLicense(); switch (status) { case 1: UpdateStatus("授权状态: 已激活 (有效授权)"); break; case 0: UpdateStatus("授权状态: 已过期 (请重新注册)"); break; case -1: UpdateStatus("授权状态: 未注册 (请激活产品)"); break; default: UpdateStatus("授权状态: 未知错误"); } } // 更新状态文本 void UpdateStatus(const char* message) { SetDlgItemTextA(g_hMainDlg, IDC_STATUS_TEXT, message); } // 主程序入口 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 初始化COM if (FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))) { MessageBoxA(NULL, "COM初始化失败", "错误", MB_OK | MB_ICONERROR); return 1; } // 初始化通用控件 INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&icc); // 创建对话框 DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAIN_DIALOG), NULL, DialogProc, 0); // 清理COM CoUninitialize(); return 0; } [NK201!无法解析的外部符号 main,函数 "int cdecl invoke main(void)"(?invoke main@@YAHXZ)中引用了该符号 LNK112(1 个无法解析的外部命令
07-18
// autostart_registry_manager.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> #include <iostream> #include <string> #include <vector> #include <map> #include <winreg.h> #include <tlhelp32.h> #include <psapi.h> class AutostartRegistryManager { private: std::map<std::string, std::string> startupLocations; std::string serviceName; std::string executablePath; void InitializeStartupLocations() { startupLocations["HKCU_Run"] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"; startupLocations["HKCU_RunOnce"] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"; startupLocations["HKLM_Run"] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"; startupLocations["HKLM_RunOnce"] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"; startupLocations["Startup_Folder"] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; } bool CreateServiceName() { // 生成合法的服务名称 char computerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD size = sizeof(computerName); if (GetComputerNameA(computerName, &size)) { serviceName = "SystemUpdateTask_" + std::string(computerName); } else { serviceName = "SystemUpdateTask_Default"; } return true; } bool GetExecutablePath() { char buffer[MAX_PATH]; if (GetModuleFileNameA(NULL, buffer, MAX_PATH)) { executablePath = std::string(buffer); return true; } return false; } bool AddToRegistry(HKEY hKey, const std::string& subKey, const std::string& valueName, const std::string& valueData) { HKEY hSubKey; LONG result = RegCreateKeyExA(hKey, subKey.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hSubKey, NULL); if (result != ERROR_SUCCESS) { std::cout << "创建注册表项失败: " << subKey << std::endl; return false; } result = RegSetValueExA(hSubKey, valueName.c_str(), 0, REG_SZ, (const BYTE*)valueData.c_str(), valueData.length() + 1); RegCloseKey(hSubKey); if (result != ERROR_SUCCESS) { std::cout << "设置注册表值失败: " << valueName << std::endl; return false; } return true; } bool RemoveFromRegistry(HKEY hKey, const std::string& subKey, const std::string& valueName) { HKEY hSubKey; LONG result = RegOpenKeyExA(hKey, subKey.c_str(), 0, KEY_WRITE, &hSubKey); if (result != ERROR_SUCCESS) { std::cout << "打开注册表项失败: " << subKey << std::endl; return false; } result = RegDeleteValueA(hSubKey, valueName.c_str()); RegCloseKey(hSubKey); if (result != ERROR_SUCCESS) { std::cout << "删除注册表值失败: " << valueName << std::endl; return false; } return true; } bool CheckRegistryValue(HKEY hKey, const std::string& subKey, const std::string& valueName) { HKEY hSubKey; LONG result = RegOpenKeyExA(hKey, subKey.c_str(), 0, KEY_READ, &hSubKey); if (result != ERROR_SUCCESS) { return false; } char buffer[1024]; DWORD bufferSize = sizeof(buffer); DWORD dataType; result = RegQueryValueExA(hSubKey, valueName.c_str(), NULL, &dataType, (LPBYTE)buffer, &bufferSize); RegCloseKey(hSubKey); return (result == ERROR_SUCCESS); } std::string GetStartupFolderPath() { char buffer[MAX_PATH]; HKEY hKey; if (RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { DWORD bufferSize = sizeof(buffer); if (RegQueryValueExA(hKey, "Startup", NULL, NULL, (LPBYTE)buffer, &bufferSize) == ERROR_SUCCESS) { RegCloseKey(hKey); return std::string(buffer); } RegCloseKey(hKey); } return ""; } bool CreateShortcutInStartupFolder() { std::string startupFolder = GetStartupFolderPath(); if (startupFolder.empty()) { std::cout << "无法获取启动文件夹路径" << std::endl; return false; } std::string shortcutPath = startupFolder + "\\" + serviceName + ".lnk"; // 创建快捷方式文件 std::ofstream shortcut(shortcutPath); if (!shortcut.is_open()) { std::cout << "无法创建快捷方式文件" << std::endl; return false; } // 写入快捷方式内容 shortcut << "[InternetShortcut]" << std::endl; shortcut << "URL=file://" << executablePath << std::endl; shortcut.close(); return true; } bool RemoveShortcutFromStartupFolder() { std::string startupFolder = GetStartupFolderPath(); if (startupFolder.empty()) { return false; } std::string shortcutPath = startupFolder + "\\" + serviceName + ".lnk"; return DeleteFileA(shortcutPath.c_str()) != 0; } bool CreateScheduledTask() { std::string command = "schtasks /create /tn \"" + serviceName + "\" /tr \"" + executablePath + "\" /sc onlogon /ru \"SYSTEM\" /f"; STARTUPINFOA si = { 0 }; PROCESS_INFORMATION pi = { 0 }; si.cb = sizeof(si); if (CreateProcessA(NULL, (LPSTR)command.c_str(), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return true; } return false; } bool RemoveScheduledTask() { std::string command = "schtasks /delete /tn \"" + serviceName + "\" /f"; STARTUPINFOA si = { 0 }; PROCESS_INFORMATION pi = { 0 }; si.cb = sizeof(si); if (CreateProcessA(NULL, (LPSTR)command.c_str(), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return true; } return false; } public: AutostartRegistryManager() { InitializeStartupLocations(); CreateServiceName(); GetExecutablePath(); } bool RegisterAutostart() { std::cout << "正在注册自启动项..." << std::endl; // 添加到HKCU\Run if (!AddToRegistry(HKEY_CURRENT_USER, startupLocations["HKCU_Run"], serviceName, executablePath)) { std::cout << "添加到HKCU\\Run失败" << std::endl; return false; } // 添加到HKLM\Run (需要管理员权限) if (!AddToRegistry(HKEY_LOCAL_MACHINE, startupLocations["HKLM_Run"], serviceName, executablePath)) { std::cout << "添加到HKLM\\Run失败 (可能需要管理员权限)" << std::endl; } // 创建启动文件夹快捷方式 if (!CreateShortcutInStartupFolder()) { std::cout << "创建启动文件夹快捷方式失败" << std::endl; } // 创建计划任务 if (!CreateScheduledTask()) { std::cout << "创建计划任务失败" << std::endl; } std::cout << "自启动项注册完成" << std::endl; return true; } bool UnregisterAutostart() { std::cout << "正在移除自启动项..." << std::endl; // 从HKCU\Run移除 RemoveFromRegistry(HKEY_CURRENT_USER, startupLocations["HKCU_Run"], serviceName); // 从HKLM\Run移除 RemoveFromRegistry(HKEY_LOCAL_MACHINE, startupLocations["HKLM_Run"], serviceName); // 移除启动文件夹快捷方式 RemoveShortcutFromStartupFolder(); // 移除计划任务 RemoveScheduledTask(); std::cout << "自启动项移除完成" << std::endl; return true; } bool IsRegistered() { // 检查HKCU\Run if (CheckRegistryValue(HKEY_CURRENT_USER, startupLocations["HKCU_Run"], serviceName)) { return true; } // 检查HKLM\Run if (CheckRegistryValue(HKEY_LOCAL_MACHINE, startupLocations["HKLM_Run"], serviceName)) { return true; } // 检查启动文件夹 std::string startupFolder = GetStartupFolderPath(); if (!startupFolder.empty()) { std::string shortcutPath = startupFolder + "\\" + serviceName + ".lnk"; if (GetFileAttributesA(shortcutPath.c_str()) != INVALID_FILE_ATTRIBUTES) { return true; } } return false; } void ListAutostartItems() { std::cout << "=== 当前自启动项 ===" << std::endl; // 列出HKCU\Run项 HKEY hKey; if (RegOpenKeyExA(HKEY_CURRENT_USER, startupLocations["HKCU_Run"].c_str(), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { char valueName[256]; char valueData[1024]; DWORD valueNameSize = sizeof(valueName); DWORD valueDataSize = sizeof(valueData); DWORD index = 0; while (RegEnumValueA(hKey, index, valueName, &valueNameSize, NULL, NULL, (LPBYTE)valueData, &valueDataSize) == ERROR_SUCCESS) { std::cout << "HKCU\\Run: " << valueName << " = " << valueData << std::endl; valueNameSize = sizeof(valueName); valueDataSize = sizeof(valueData); index++; } RegCloseKey(hKey); } // 列出HKLM\Run项 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, startupLocations["HKLM_Run"].c_str(), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { char valueName[256]; char valueData[1024]; DWORD valueNameSize = sizeof(valueName); DWORD valueDataSize = sizeof(valueData); DWORD index = 0; while (RegEnumValueA(hKey, index, valueName, &valueNameSize, NULL, NULL, (LPBYTE)valueData, &valueDataSize) == ERROR_SUCCESS) { std::cout << "HKLM\\Run: " << valueName << " = " << valueData << std::endl; valueNameSize = sizeof(valueName); valueDataSize = sizeof(valueData); index++; } RegCloseKey(hKey); } } std::string GetServiceName() const { return serviceName; } std::string GetExecutablePath() const { return executablePath; } }; int main() { SetConsoleOutputCP(CP_UTF8); AutostartRegistryManager manager; std::cout << "自启动注册管理器" << std::endl; std::cout << "服务名称: " << manager.GetServiceName() << std::endl; std::cout << "可执行文件路径: " << manager.GetExecutablePath() << std::endl; // 检查当前状态 if (manager.IsRegistered()) { std::cout << "当前已注册自启动" << std::endl; } else { std::cout << "当前未注册自启动" << std::endl; } // 列出当前自启动项 std::cout << "\n当前系统自启动项:" << std::endl; manager.ListAutostartItems(); // 注册自启动 std::cout << "\n正在注册自启动..." << std::endl; if (manager.RegisterAutostart()) { std::cout << "自启动注册成功" << std::endl; } else { std::cout << "自启动注册失败" << std::endl; } // 再次检查状态 if (manager.IsRegistered()) { std::cout << "注册后状态: 已注册" << std::endl; } else { std::cout << "注册后状态: 未注册" << std::endl; } // 移除自启动 std::cout << "\n正在移除自启动..." << std::endl; if (manager.UnregisterAutostart()) { std::cout << "自启动移除成功" << std::endl; } else { std::cout << "自启动移除失败" << std::endl; } std::cout << "\n自启动注册管理测试完成" << std::endl; system("pause"); return 0; } 用vs2015编译的时候报错了,修改代码并给出完整的C++代码
07-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值