Перейти к содержанию
Авторизация  
XAMAC

[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 (то есть, массивом символов, с завершающим нулевым символом) - неправильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
39 минут назад, Xipho сказал:

неправильно

Главное что код выходит короче, проще наглядней, и работает правильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 часов назад, imaginary сказал:

и работает правильно

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 подвезли перегрузку оператора == в свежей версии компилятора.

Поделиться сообщением


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

Ухты  imaginary утерла нос partoftheworlD крутяк!!!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
39 минут назад, Garik66 сказал:
  Скрыть контент

Ухты  imaginary утерла нос partoftheworlD крутяк!!!

 

Та не, тебе показалось :D

 

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

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

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