C++ GetModuleFileNameEx-拆分输出

C++ GetModuleFileNameEx-拆分输出,c++,process,C++,Process,我试图从进程id中获取进程名称,我使用了GetModuleFileNameEx并编写了这个函数 char* ProcessName(ULONG_PTR ProcessId) { char szBuffer[MAX_PATH+1]; HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, ProcessId); if(GetM

我试图从进程id中获取进程名称,我使用了GetModuleFileNameEx并编写了这个函数

char* ProcessName(ULONG_PTR ProcessId)
{
    char szBuffer[MAX_PATH+1];
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, ProcessId);

    if(GetModuleFileNameEx(hProcess, NULL, szBuffer, MAX_PATH) == 0)
        sprintf(szBuffer, "null");

    CloseHandle(hProcess);

    return szBuffer;
}
输出是完整路径和进程名,我希望将其拆分,以便在没有完整路径的情况下获得进程名


有什么方法可以做到这一点,或者我可以使用任何其他函数从进程id获取进程名吗?

您可以使用PathFindFileName()从path获取文件名。

您可以使用PathFindFileName()从路径获取文件名。

首先:返回一个指向本地内存的指针,结果将以眼泪结束

char* ProcessName(ULONG_PTR ProcessId) {
    char szBuffer[MAX_PATH+1];
    ...
    return szBuffer;
}
除此之外,您还可以使用或类似的方法从路径中获取文件名,或使用shell API在Windows平台上提供的函数

#include "windows.h"
#include "Psapi.h"
#include "Shlwapi.h"
#include <string>
#include <iostream>

#pragma comment(lib, "Shlwapi.lib")

std::string ProcessName(DWORD ProcessId)
{
  std::string name;
  HANDLE Handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessId);
  if (Handle) {
    TCHAR Buffer[MAX_PATH];
    if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH)) {
      name = std::string(PathFindFileName(Buffer));
    }
    else {
      // Now would be a good time to call GetLastError()
    }
    CloseHandle(Handle);
  }

  return name;
}

int main() {

  std::cout << ProcessName(GetCurrentProcessId());

  return 0;
}
#包括“windows.h”
#包括“Psapi.h”
#包括“Shlwapi.h”
#包括
#包括
#pragma注释(lib,“Shlwapi.lib”)
std::字符串ProcessName(DWORD ProcessId)
{
std::字符串名;
HANDLE HANDLE=OpenProcess(进程查询信息、进程虚拟机读取、假、进程ID);
if(句柄){
TCHAR缓冲区[最大路径];
if(GetModuleFileNameEx(句柄、0、缓冲区、最大路径)){
name=std::string(PathFindFileName(缓冲区));
}
否则{
//现在是调用GetLastError()的好时机
}
关闭手柄(手柄);
}
返回名称;
}
int main(){

std::cout首先:返回一个指向本地内存的指针,这将以眼泪结束

char* ProcessName(ULONG_PTR ProcessId) {
    char szBuffer[MAX_PATH+1];
    ...
    return szBuffer;
}
除此之外,您还可以使用或类似的方法从路径中获取文件名,或使用shell API在Windows平台上提供的函数

#include "windows.h"
#include "Psapi.h"
#include "Shlwapi.h"
#include <string>
#include <iostream>

#pragma comment(lib, "Shlwapi.lib")

std::string ProcessName(DWORD ProcessId)
{
  std::string name;
  HANDLE Handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessId);
  if (Handle) {
    TCHAR Buffer[MAX_PATH];
    if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH)) {
      name = std::string(PathFindFileName(Buffer));
    }
    else {
      // Now would be a good time to call GetLastError()
    }
    CloseHandle(Handle);
  }

  return name;
}

int main() {

  std::cout << ProcessName(GetCurrentProcessId());

  return 0;
}
#包括“windows.h”
#包括“Psapi.h”
#包括“Shlwapi.h”
#包括
#包括
#pragma注释(lib,“Shlwapi.lib”)
std::字符串ProcessName(DWORD ProcessId)
{
std::字符串名;
HANDLE HANDLE=OpenProcess(进程查询信息、进程虚拟机读取、假、进程ID);
if(句柄){
TCHAR缓冲区[最大路径];
if(GetModuleFileNameEx(句柄、0、缓冲区、最大路径)){
name=std::string(PathFindFileName(缓冲区));
}
否则{
//现在是调用GetLastError()的好时机
}
关闭手柄(手柄);
}
返回名称;
}
int main(){

std::cout这只从它搜索最后一个字符的完整路径中获取文件名,\n然后moduleNameOnly是最后一位减去\i,“strrchr”是wcsrchr的字符版本

wchar_t* moduleNameOnly = wcsrchr(szModName, L'\\')+1;

它仅从搜索最后一个字符的完整路径中获取文件名,\n然后moduleNameOnly是最后一位减去\i,“strrchr”是wcsrchr的字符版本

wchar_t* moduleNameOnly = wcsrchr(szModName, L'\\')+1;

使用_splitpath()()将完整路径拆分为多个部分。感谢您现在所做的工作,除非进程名称可以表示在当前代码页的可能名称子集中,否则您的代码将失败,使用函数的
WCHAR
变体将是一个可靠的选择。@UlrichEckhardt最好的建议是尽可能避免
char*
支持
std::string
。阅读:“如果函数失败,返回值为零。若要获取扩展错误信息,请调用GetLastError。”使用_splitpath()()将完整路径拆分为多个部分。感谢您现在所做的工作,除非进程名称可以表示在当前代码页的可能名称子集中,否则您的代码将失败,使用函数的
WCHAR
变体将是一个可靠的选择。@UlrichEckhardt最好的建议是尽可能避免
char*
支持
std::string
。阅读:“如果函数失败,返回值为零。若要获取扩展错误信息,请调用GetLastError。”
GetModuleFileNameEx
在64位系统中不适用于32位应用程序,因此我将
GetProcessImageFileName
\u fullpath
\u splitpath\u
一起使用,其工作正常。
GetModuleFileNameEx
在64位系统中不适用于32位应用程序,因此我将
GetProcessImageFileName
一起使用ullpath
\u splitpath
及其工作正常。