Visual Studio 2022中可运行的C++程序,单独启动.exe时失败
问题:VS中Ctrl+F5可正常运行的进程修改程序,直接运行exe却无法打开目标进程
问题说明
我编写了一个C++程序,在Visual Studio 2022中按Ctrl+F5(不调试运行)能正常执行,但直接运行解决方案生成的.exe文件时,无法打开audiodg.exe进程。已确认运行的是同一个exe文件,且已在UAC设置中指定requireAdministrator权限,起初以为不是权限问题。
手动运行exe时,会提示Failed to open process for PID 4764,exe未移动过,也无外部DLL依赖。
代码示例
#include <iostream> #include <string> #include <vector> #include <ranges> #include <algorithm> #include <memory> #include <Windows.h> #include <TlHelp32.h> #include <filesystem> #include "WindowsService.h" namespace fs = std::filesystem; constexpr std::wstring_view PROCESS_NAME = L"audiodg.exe"; DWORD getAudiodgPID() { HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snapshot == INVALID_HANDLE_VALUE) { std::cerr << "Error creating process snapshot: " << ::GetLastError() << std::endl; return 0x0; } PROCESSENTRY32 process_entry; process_entry.dwSize = sizeof(process_entry); BOOL result = ::Process32First(snapshot, &process_entry); while (result && std::wstring_view(process_entry.szExeFile) != PROCESS_NAME) { result = ::Process32Next(snapshot, &process_entry); } if (!result) { std::cerr << "Could not find process for audiodg.exe" << std::endl; return 0x0; } return process_entry.th32ProcessID; } void setAffinity(DWORD PID, DWORD_PTR mask) { HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); if (!handle) { std::cerr << "Failed to open process for PID " << PID << std::endl; return; } if (::SetProcessAffinityMask(handle, mask) == 0) { std::cerr << "Failed to set affinity mask to handle: " << ::GetLastError() << std::endl; return; } std::cout << "CPU affinity set\n"; } int main() { std::cout << "Initializing...\n"; wchar_t buffer[MAX_PATH]; GetModuleFileName(NULL, buffer, MAX_PATH); std::wcout << "Process name: " << buffer << std::endl; fs::path source = buffer; fs::path destination = "C:/temp/audiodgfix.exe"; try { fs::copy(source, destination, fs::copy_options::overwrite_existing); } catch (const fs::filesystem_error& ex) { std::cout << "Error copying itself: " << ex.what() << std::endl; } // 以下代码已移除,不影响问题表现 /*WindowsService windowsService; windowsService.RegisterService(L"audiodgafffixer", L"Audio Affinity Fixer", L"Fixes Windows' audiodg.exe process to have affinity with just CPU 2 to fix Discord having glitchy audio");*/ DWORD processHandle = getAudiodgPID(); if (processHandle == 0x0) return 1; setAffinity(processHandle, 0b100); system("pause"); return 0; }
解决方案
即便拥有管理员权限,普通用户依然没有修改audiodg.exe进程的权限。VS中运行正常是因为VS本身以管理员身份启动,继承了完整的管理员上下文;而直接双击exe时,即使触发UAC提权,仍缺少修改该系统进程的特定权限。
解决方式:
- 右键exe选择以管理员身份运行,确保程序获得完整的管理员权限上下文
- 调整系统权限设置,允许本地用户对
audiodg.exe进程拥有修改权限
内容的提问来源于stack exchange,提问作者Zeki
相关产品推荐
相关产品推荐

