XAMAC Опубликовано 16 ноября, 2019 Поделиться Опубликовано 16 ноября, 2019 По уроку кодера пытаюсь получить 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) Надеюсь это не внесет существенных ошибок в следующий код Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 16 ноября, 2019 Поделиться Опубликовано 16 ноября, 2019 (изменено) Зачем тебе такие сложности, напиши без всяких 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; } Изменено 16 ноября, 2019 пользователем imaginary Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 17 ноября, 2019 Поделиться Опубликовано 17 ноября, 2019 В 16.11.2019 в 15:56, imaginary сказал: напиши без всяких char, у тебя же есть строка А ты уверена, что в сравнении pInfo.szExeFile == name name будет приведен к типу const *char (или хотя бы к const *wchar_t)? Я вот чот не уверен. И сравнивать объект класса wstring с zero terminated string (то есть, массивом символов, с завершающим нулевым символом) - неправильно. Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 17 ноября, 2019 Поделиться Опубликовано 17 ноября, 2019 39 минут назад, Xipho сказал: неправильно Главное что код выходит короче, проще наглядней, и работает правильно Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 18 ноября, 2019 Поделиться Опубликовано 18 ноября, 2019 12 часов назад, imaginary сказал: и работает правильно То есть, ты уверена, что в данном случае wstring правильно неявно скастится в const char *? Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 18 ноября, 2019 Поделиться Опубликовано 18 ноября, 2019 8 часов назад, Xipho сказал: данном случае wstring правильно неявно скастится в const char *? Тут .szExeFile это юникод, и потому не const char *, так что всё будет замечательно Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 18 ноября, 2019 Поделиться Опубликовано 18 ноября, 2019 В 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; } Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 18 ноября, 2019 Поделиться Опубликовано 18 ноября, 2019 2 часа назад, partoftheworlD сказал: Это не будет работать без описания перегрузки, типа Да будет всё работать, ещё как будет, докажи что нет, на обычной студии 2019 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 18 ноября, 2019 Поделиться Опубликовано 18 ноября, 2019 1 час назад, imaginary сказал: Да будет всё работать, ещё как будет Специально проверил, действительно, все работает корректно. Видимо, в wstring подвезли перегрузку оператора == в свежей версии компилятора. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 18 ноября, 2019 Поделиться Опубликовано 18 ноября, 2019 Спойлер Ухты imaginary утерла нос partoftheworlD крутяк!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
roma912 Опубликовано 18 ноября, 2019 Поделиться Опубликовано 18 ноября, 2019 39 минут назад, Garik66 сказал: Скрыть контент Ухты imaginary утерла нос partoftheworlD крутяк!!! Та не, тебе показалось Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения