Кароч, не особо силен я в плюсах, но вот хочу что-бы моя прожка запускалась и работала только если запущен процесс с именем, скажем, "processимя.exe", (да, имя процесса содержит латинские и кириллические символы, так нада). Суть в том, что сам "processимя.exe" (основная программа, из которой будет запускаться прожка на c++) - я наколхозил в C#, в котором более-менее волоку, в т. ч. реализовал защиту от запуска на виртуальных машинах (отдельное спасибо камраду r3xq1: https://zelenka.guru/threads/1687219/) мучения Сама же прожка, о которой пойдет дальше речь - на плюсах. Пытаюсь значит чектать процесс "processимя.exe" следующим образом: Запилил функцию BOOL IsProcessRun(const char* const processName) //char пытался на wchar_t менять, не помогает { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); Process32First(hSnapshot, &pe); while (1) { if (StrCmpI(pe.szExeFile, processName) == 0) return true; if (!Process32Next(hSnapshot, &pe)) return false; } } Code BOOL IsProcessRun(const char* const processName) //char пытался на wchar_t менять, не помогает { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); Process32First(hSnapshot, &pe); while (1) { if (StrCmpI(pe.szExeFile, processName) == 0) return true; if (!Process32Next(hSnapshot, &pe)) return false; } } Ну и пытаюсь вызывать ее int main() { if (IsProcessRun("processимя.exe")) MessageBoxA(NULL, "process run!", "ok", MB_OK | MB_ICONINFORMATION); else exit(0); } Code int main() { if (IsProcessRun("processимя.exe")) MessageBoxA(NULL, "process run!", "ok", MB_OK | MB_ICONINFORMATION); else exit(0); } Поначалу визуалСтудия унижала и (еще до сборки) сыпала ошибки типа: аргумент типа "const char *" несовместим с параметром типа "PCWSTR" устранил путем изменения в свойствах проекта > |свойства конфигурации| > |дополнительно| > |набор символов| > |юникод/многобайтовая кодировка| Ок, собрал. На винде с рашн интерфейсом функция норм отрабатывает (если запущен "processимя.exe" - все ок, если нет - закрывается) НО! На инглиш винде прожка в упор не видит запущенного процесса "processимя.exe" (хотя он запущен) и переходит к else exit(0); Code else exit(0); Если в if (IsProcessRun("processимя.exe")) добавить L if (IsProcessRun(L"processимя.exe")) , поменять в IsProcessRun(const char* const processName) char на wchar_t , опять шаманить с |юникод/многобайтовая кодировка| - визуалСтудия снова унижает, но уже на этапе компиляции: Ошибка LNK2001 неразрешенный внешний символ __imp_StrCmpIW. myapp D:\myapp\my_func.obj Я уже и с StrCmpI ебался (на StrCmpI менял, на StrCmpIW менял, опять |юникод/многобайтовая кодировка| менял туда-сюда - результат примерно одинаковый. Кто в плюсах шарит, подскажите где собака зарыта, а то я уже гугл весь изгуглил, про эти ебучие чар, вчар_т, ПЦВСТР, и т. д. поначитался, все-равно нихуя не понятно что делать, что-бы, по сути, простая прожка заработала. В общем, получилось. Прога на C++ продолжает работу только после проверки на наличие в запущенных процессах процесса "processимя.exe", в случае отсутствия такового - завершает работу. Вдруг кому пригодится //Получаем список запущенных процессов для сравнения с заданным именем процесса DWORD64 WtfProcess(LPCTSTR szProcessName) { PROCESSENTRY32 pe32; HANDLE hSnapshot = NULL; SecureZeroMemory(&pe32, sizeof(PROCESSENTRY32)); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return 0; } pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe32) == FALSE) { CloseHandle(hSnapshot); return 0; } if (_wcsicmp(pe32.szExeFile, szProcessName) == 0) { CloseHandle(hSnapshot); return pe32.th32ProcessID; } while (Process32Next(hSnapshot, &pe32)) { if (_wcsicmp(pe32.szExeFile, szProcessName) == 0) { CloseHandle(hSnapshot); return pe32.th32ProcessID; } } CloseHandle(hSnapshot); return 0; } C //Получаем список запущенных процессов для сравнения с заданным именем процесса DWORD64 WtfProcess(LPCTSTR szProcessName) { PROCESSENTRY32 pe32; HANDLE hSnapshot = NULL; SecureZeroMemory(&pe32, sizeof(PROCESSENTRY32)); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return 0; } pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe32) == FALSE) { CloseHandle(hSnapshot); return 0; } if (_wcsicmp(pe32.szExeFile, szProcessName) == 0) { CloseHandle(hSnapshot); return pe32.th32ProcessID; } while (Process32Next(hSnapshot, &pe32)) { if (_wcsicmp(pe32.szExeFile, szProcessName) == 0) { CloseHandle(hSnapshot); return pe32.th32ProcessID; } } CloseHandle(hSnapshot); return 0; } //Если нужный нам процесс запущен - выводим сообщение, если нет - завершаем работу нашей программы VOID LolzGuru() { const TCHAR* szProcesses[] = { _T("ЙобаProcess.exe"), }; DWORD64 iLength = sizeof(szProcesses) / sizeof(szProcesses[0]); for (int i = 0; i < iLength; i++) { if (WtfProcess(szProcesses[i])) MessageBoxA(NULL, "process runing!", "ok", MB_OK | MB_ICONINFORMATION); else { exit(0); } } } C //Если нужный нам процесс запущен - выводим сообщение, если нет - завершаем работу нашей программы VOID LolzGuru() { const TCHAR* szProcesses[] = { _T("ЙобаProcess.exe"), }; DWORD64 iLength = sizeof(szProcesses) / sizeof(szProcesses[0]); for (int i = 0; i < iLength; i++) { if (WtfProcess(szProcesses[i])) MessageBoxA(NULL, "process runing!", "ok", MB_OK | MB_ICONINFORMATION); else { exit(0); } } }