如何使用c++在windows中获取某个事物的进程ID
How do I get the process ID of something in windows using c++
我正在尝试使用进程的名称获取进程的procid。错误是关于procEntry.szExeFile。然而,我得到了错误:
[{
"owner": "C/C++",
"code": "167",
"severity": 8,
"message": "argument of type "WCHAR *" is incompatible with parameter of type "const char *"",
"source": "C/C++",
"startLineNumber": 17,
"startColumn": 17,
"endLineNumber": 17,
"endColumn": 26
},{
"owner": "C/C++",
"code": "167",
"severity": 8,
"message": "argument of type "WCHAR *" is incompatible with parameter of type "const char *"",
"source": "C/C++",
"startLineNumber": 24,
"startColumn": 21,
"endLineNumber": 24,
"endColumn": 30
}]
是否有其他方法可以获取进程ID?我已尝试重新安装c++库。我也试过转换它,但也没用。这是我正在使用的代码:
#include <stdlib.h>
#include <iostream>
#include <string>
#include <windows.h>
#include <TlHelp32.h>
// Get process id from name
DWORD GetProcId(const char* procName)
{
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(procEntry);
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (hSnap == INVALID_HANDLE_VALUE)
return 0;
Process32First(hSnap, &procEntry);
if (!strcmp(procEntry.szExeFile, procName))
{
CloseHandle(hSnap);
return procEntry.th32ProcessID;
}
while (Process32Next(hSnap, &procEntry))
{
if (!strcmp(procEntry.szExeFile, procName))
{
CloseHandle(hSnap);
return procEntry.th32ProcessID;
}
}
CloseHandle(hSnap);
return 0;
}
int main()
{
// Get process id from name
DWORD procId = GetProcId("csgo.exe");
if (!procId)
{
std::cout << "Could not find process" << std::endl;
return 0;
}
// wait for key press
std::cout << "Press any key to continue" << std::endl;
std::getchar();
return 0;
}
您使用的是基于TCHAR
的宏,并且在编译项目时定义了UNICODE
,因此这些宏映射到基于wchar_t
的API(即PROCESSENTRY32
->PROCESSENTRY32W
、Process32First
->Process32FirstW
等(。因此,PROCESSENTRY32::szExeFile
字段是wchar_t[]
阵列。但是,strcmp()
需要char*
字符串,因此会出现编译器错误。
由于您的函数接受const char*
作为输入,因此根本不应该使用TCHAR
API。使用基于A
nsi的API,例如:
#include <iostream>
#include <string>
#include <cstring>
#include <windows.h>
#include <TlHelp32.h>
// Get process id from name
DWORD GetProcId(const char* procName)
{
PROCESSENTRY32A procEntry;
procEntry.dwSize = sizeof(procEntry);
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (hSnap == INVALID_HANDLE_VALUE)
return 0;
if (Process32FirstA(hSnap, &procEntry))
{
do
{
if (std::strcmp(procEntry.szExeFile, procName) == 0)
{
CloseHandle(hSnap);
return procEntry.th32ProcessID;
}
}
while (Process32NextA(hSnap, &procEntry));
}
CloseHandle(hSnap);
return 0;
}
int main()
{
// Get process id from name
DWORD procId = GetProcId("csgo.exe");
if (!procId)
{
std::cout << "Could not find process" << std::endl;
return 0;
}
// wait for key press
std::cout << "Press any key to continue" << std::endl;
std::getchar();
return 0;
}
否则,将代码更改为使用wchar_t
字符串和基于W
ide的API,例如:
#include <iostream>
#include <string>
#include <cwchar>
#include <windows.h>
#include <TlHelp32.h>
// Get process id from name
DWORD GetProcId(const wchar_t* procName)
{
PROCESSENTRY32W procEntry;
procEntry.dwSize = sizeof(procEntry);
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (hSnap == INVALID_HANDLE_VALUE)
return 0;
if (Process32FirstW(hSnap, &procEntry))
{
do
{
if (std::wcscmp(procEntry.szExeFile, procName) == 0)
{
CloseHandle(hSnap);
return procEntry.th32ProcessID;
}
}
while (Process32NextW(hSnap, &procEntry));
}
CloseHandle(hSnap);
return 0;
}
int main()
{
// Get process id from name
DWORD procId = GetProcId(L"csgo.exe");
if (!procId)
{
std::cout << "Could not find process" << std::endl;
return 0;
}
// wait for key press
std::cout << "Press any key to continue" << std::endl;
std::getchar();
return 0;
}
如果可以的话,请远离TCHAR
及其相关宏。它们是Win9x/ME时代的残余,当时人们正在将代码从ANSI迁移到UNICODE。它们在现代编码中真的没有地位,因为现在一切都是Unicode。
相关文章:
- 同一线程 ID 是否可以在同一进程中重复使用?
- 无法获取进程 ID 4 (ntoskrnl.exe) 的可执行路径
- 为什么if(fork()==0){getpid()}和popen()进程返回相同的进程id
- 从 C++ 中的二进制路径(命令行语句)获取进程 ID
- 使用进程 ID 终止进程
- C++ 通过进程 ID 获取进程的名称
- 按名称查找进程 ID 的快速方法
- 如何在 Windows 进程回调中断开连接时获取设备信息(硬件 ID)
- WinEventHook未捕获特定进程id中的事件
- 使用 fork 创建子进程时,父 ID 与父 ID 不同
- 视觉C++从父进程 ID 获取子进程 ID
- 确定进程的输入线程 ID
- 获取 Winlogon.exe 的会话 ID 和进程 ID
- 如何在浏览器子进程主机Impl->启动后获取浏览器子进程的进程ID
- 如何在进程间通信中获取其他终结点的进程 ID
- 父级的父级的进程 ID - Linux
- 在检查进程 ID 时使用 WaitForSingleObject 的好处
- C++:通过进程id、进程句柄和标题名称从进程中获取唯一窗口的窗口句柄的最佳方法
- 如何找到运行进程的物理套接字 ID/编号
- PIN - 获取正在检测的二进制文件的进程 ID