Nul*_*ptr 3 c++ windows winapi process
我有一个像这样的函数来获取进程'id的名字,但它总是返回0我尝试的每个进程:
DWORD GetProcessId(std::string ProcessName)
{
HANDLE hsnap;
PROCESSENTRY32 pt;
DWORD PiD;
hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pt.dwSize = sizeof(PROCESSENTRY32);
do {
if (!strcmp(pt.szExeFile, ProcessName.c_str())) {
CloseHandle(hsnap);
PiD = pt.th32ProcessID;
return PiD;
if (PiD != NULL) {
return 0;
}
}
} while (Process32Next(hsnap, &pt));
return 1;
}
Run Code Online (Sandbox Code Playgroud)
主要功能:
int main()
{
DWORD pid = GetProcessId("calc.exe");
std::cout << pid;
if (pid == 0) { printf("error 1"); getchar(); }//error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里有几个问题.
首先,GetProcessId是Windows API函数的名称,它将单个HANDLE作为参数.HANDLE通常被定义为void*,所以这意味着任何指针都将满足函数签名.
你自己GetProcessId需要一个,std::string但你通过传递一个指向字符串常量的指针来调用它.通常情况下这是可以的,std::string可以从中构建,但是因为Windows API版本GetProcessId已经匹配了编译器优先调用的函数签名.所以基本上你自己的函数实际上从未被调用.
你自己的功能也存在一些问题.首先,你通过循环的第一次迭代是与垃圾记忆进行比较 - 你忘了打电话Process32First,所以pt第一次没有初始化.其次,如果没有找到该过程,则会泄漏hsnap手柄.
请尝试以下方法:
DWORD MyGetProcessId(LPCTSTR ProcessName) // non-conflicting function name
{
PROCESSENTRY32 pt;
HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pt.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hsnap, &pt)) { // must call this first
do {
if (!lstrcmpi(pt.szExeFile, ProcessName)) {
CloseHandle(hsnap);
return pt.th32ProcessID;
}
} while (Process32Next(hsnap, &pt));
}
CloseHandle(hsnap); // close handle on failure
return 0;
}
int main()
{
DWORD pid = MyGetProcessId(TEXT("calc.exe"));
std::cout << pid;
if (pid == 0) { printf("error 1"); getchar(); }//error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我已经将函数更改为不再使用std::string,并且使用lstrcmpi它意味着它将用作Ansi或Unicode构建.正如下面的评论员所建议的,这些天你真的应该使用Unicode.
| 归档时间: |
|
| 查看次数: |
5584 次 |
| 最近记录: |