C++ GetModuleFileNameEx-拆分输出
我试图从进程id中获取进程名称,我使用了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
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
及其工作正常。