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); // 记得关闭句柄,避免资源泄漏
关键细节说明
wcsrchrvswcsstr:wcsrchr专门用于查找单个字符最后一次出现的位置,而wcsstr是查找子串第一次出现的位置,这里我们只需要找单个反斜杠,所以wcsrchr是正确选择。- 变量名修正:你原代码里把
processName拼写成了proccessName,这是笔误,需要修正避免编译错误。 - 错误处理:建议增加句柄和API调用的错误检查,方便调试时定位问题。
- 资源释放:使用完进程句柄后记得调用
CloseHandle,防止资源泄漏。
内容的提问来源于stack exchange,提问作者not an alien
相关产品推荐
相关产品推荐

