Проблема в том, что вы используете TCHAR
версии Process32First()
/Process32Next()
, и ваш отладчик screnshot ясно показывает, что вы компиляции проекта для Unicode, так TCHAR
соответствует WCHAR
и таким образом process.szExeFile
является массивом WCHAR[]
. Вы неправильно набираете этот массив для указателя char*
. Вы не можете напрямую сравнивать строку Unicode с строкой Ansi. Вам нужно преобразовать одну строку в кодировку другой строки, а затем сравнить ее.
Вы также просачиваете HANDLE
, возвращенный CreateToolhelp32Snapshot()
.
Поскольку вы пропускание Ansi std::string
в качестве входных данных для вашей GetProcessValues()
функции, то простого решения было бы использовать Ansi версии Process32First()
/Process32Next()
вместо этого, так process.szExeFile
является сейчас CHAR[]
массивом, и, следовательно, никакого преобразования необходимо:
HANDLE GetProcessValues(std::string ProcName)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE)
return NULL;
PROCESSENTRY32A process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
const char* ProcNameChar = ProcName.c_str();
HANDLE hProc = NULL;
if (Process32FirstA(snapshot, &process))
{
do
{
if (_stricmp(process.szExeFile, ProcNameChar) == 0)
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
break;
}
}
while (Process32NextA(snapshot, &process));
}
CloseHandle(snapshot);
return hProc;
}
Однако, вы действительно должны держаться подальше от использования Анси API. Windows - это ОС на базе Unicode и долгое время. Используйте Unicode API, вместо того, чтобы:
HANDLE GetProcessValues(std::wstring ProcName)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE)
return NULL;
PROCESSENTRY32W process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
const wchar_t* ProcNameChar = ProcName.c_str();
HANDLE hProc = NULL;
if (Process32FirstW(snapshot, &process))
{
do
{
if (_wcsicmp(process.szExeFile, ProcNameChar) == 0)
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
break;
}
}
while (Process32NextW(snapshot, &process));
}
CloseHandle(snapshot);
return hProc;
}
Если параметр ProcName
обязательно должен быть std::string
, то вы можете:
конвертировать ProcName
в Unicode с использованием MultiByteToWideChar()
, std::wstring_convert
и т.д., а затем сравнить это результат для строк, возвращаемых API Unicode.
преобразования строк из API Unicode в ANSI с помощью WideCharToMultiByte()
, std::wstring_convert
и т.д., а затем сравнить эти результаты ProcName
.
С вашего изображения 'process.szExeFile' является wchar * not char *. – drescherjm
Почему вы применили 'char *' в первом аргументе '_stricmp'? Если бы было закрыто компилятор о ошибке несоответствия типа, прекратите делать это и предоставите правильный тип строки функции. Никогда не применяйте строковые типы - отливка ** не ** конверсия. – PaulMcKenzie
Вы лгали компилятору и получили ваши десерты –