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

std::wcsstr未返回预期结果:提取进程exe名称失败

问题分析与解决方案

你遇到的问题根源在于**std::wcsstr是查找字符串中第一个匹配的子串**,而你传入的L"\\"会匹配路径开头的第一个反斜杠,所以返回的是从第一个反斜杠开始的整个路径,自然得不到你想要的最后一段exe名称。

要提取路径最后一段的可执行文件名,你需要找到最后一个反斜杠的位置,这时候应该用宽字符版本的反向查找函数std::wcsrchr,它会返回最后一次出现指定字符的指针。

修正后的代码

// includes...
int pid = 1234;
HANDLE hProcess;
TCHAR processName[2048] = {}; // 注意你原代码里的变量名笔误:proccessName → processName

// 获取进程句柄
hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, false, pid);
if (hProcess == NULL) {
    // 增加错误处理,方便调试
    std::wcerr << "OpenProcess failed, error: " << GetLastError() << std::endl;
    return 1;
}

// 获取进程完整路径
if (GetProcessImageFileName(hProcess, processName, sizeof(processName)) == 0) {
    std::wcerr << "GetProcessImageFileName failed, error: " << GetLastError() << std::endl;
    CloseHandle(hProcess);
    return 1;
}

// 查找最后一个反斜杠
TCHAR* lastBackslash = std::wcsrchr(processName, L'\\');
if (lastBackslash != NULL) {
    // 跳过反斜杠,取后面的部分
    std::wcout << "Success, name is: " << lastBackslash + 1 << std::endl;
} else {
    // 处理路径中没有反斜杠的异常情况
    std::wcout << "Success, name is: " << processName << std::endl;
}

CloseHandle(hProcess); // 记得关闭句柄,避免资源泄漏

关键细节说明

  • wcsrchr vs wcsstr:wcsrchr专门用于查找单个字符最后一次出现的位置,而wcsstr是查找子串第一次出现的位置,这里我们只需要找单个反斜杠,所以wcsrchr是正确选择。
  • 变量名修正:你原代码里把processName拼写成了proccessName,这是笔误,需要修正避免编译错误。
  • 错误处理:建议增加句柄和API调用的错误检查,方便调试时定位问题。
  • 资源释放:使用完进程句柄后记得调用CloseHandle,防止资源泄漏。

内容的提问来源于stack exchange,提问作者not an alien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:38:44