You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:10:03