Перейти к содержанию

[C++] Получение pID процесса


Рекомендуемые сообщения

По уроку кодера пытаюсь получить pID процесса, но имею ошибку следующего типа "C++ аргумент типа const char* несовместим с параметром типа char*"
Вот мой код: 

Спойлер

#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

DWORD GetProcesByName(char* pName)

{
	DWORD pID = 0;
	HANDLE snapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 pInfo;
	pInfo.dwSize = sizeof(PROCESSENTRY32);

	if (Process32First(snapShot, &pInfo))
	{
		while (Process32Next(snapShot, &pInfo))
		{
			if (_stricmp(pName, pInfo.szExeFile) == 0)
			{
				pID = pInfo.th32ProcessID;
				break;
				CloseHandle(snapShot);
				return pID;
			}
		}
	}
	CloseHandle(snapShot);
	return 0;
}
	

int main() {
	
	DWORD pID = GetProcesByName("calculator.exe");
	cout << pID ;
	return 0;
}


 

Проверил несколько раз, у кодера написано так же и никаких синтактических ошибок нет, у меня же в этом месте какая то ошибка GetProcesByName("calculator.exe");
Пытался гуглить, но таки не смог понять истинную причину

Вроде бы понимаю каждую строчку написаного кода, но что то явно пошло не так)

UPD!
Нашел решение добавлением const в  DWORD GetProcesByName(const char* pName)
Надеюсь это не внесет существенных ошибок в следующий код
 

Ссылка на комментарий
Поделиться на другие сайты

Зачем тебе такие сложности, напиши без всяких char, у тебя же есть строка
 

Спойлер

#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>


using namespace std;

int GetProcesByName(wstring name)

{
	HANDLE snapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 pInfo = { 0 }; pInfo.dwSize = sizeof(PROCESSENTRY32);
	
	while (Process32Next(snapShot, &pInfo))
	{
		if ( pInfo.szExeFile == name)
		{
			CloseHandle(snapShot);
			return pInfo.th32ProcessID;
		}
	}
	CloseHandle(snapShot);
	return 0;
}
	

int main() {
	
	int pID = GetProcesByName(L"calculator.exe");
	cout << pID ;
	return 0;
}

 

 

Изменено пользователем imaginary
Ссылка на комментарий
Поделиться на другие сайты

В 16.11.2019 в 15:56, imaginary сказал:

напиши без всяких char, у тебя же есть строка

А ты уверена, что в сравнении 

pInfo.szExeFile == name

name будет приведен к типу const *char (или хотя бы к const *wchar_t)? Я вот чот не уверен. И сравнивать объект класса wstring с zero terminated string (то есть, массивом символов, с завершающим нулевым символом) - неправильно.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Xipho сказал:

данном случае wstring правильно неявно скастится в const char *?

Тут .szExeFile это юникод, и потому не const char *, так что всё будет замечательно

Ссылка на комментарий
Поделиться на другие сайты

В 16.11.2019 в 13:56, imaginary сказал:

if ( pInfo.szExeFile == name)

Это не будет работать без описания перегрузки, типа

Спойлер

bool operator==(const char(& string)[260], const wstring& wstring)
{
	size_t bytesCopied = 0;
	char strBaseName[MAX_PATH] = { 0 };

	wcstombs_s(&bytesCopied, strBaseName, wstring.c_str(), MAX_PATH);
  	if(_strcmpi(string, strBaseName))
    	{
      		return true;
    	}
  	return false;
}

 

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, partoftheworlD сказал:

Это не будет работать без описания перегрузки, типа

Да будет всё работать, ещё как будет, докажи что нет, на обычной студии 2019

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, imaginary сказал:

Да будет всё работать, ещё как будет

Специально проверил, действительно, все работает корректно. Видимо, в wstring подвезли перегрузку оператора == в свежей версии компилятора.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.