Загрузка...

Непрвославный unicode. Хочу чекнуть процесс по имени, но Visual Studio постоянно унижает...

Тема в разделе C/C++ создана пользователем BashOrgRu 15 янв 2022. 187 просмотров

  1. BashOrgRu
    BashOrgRu Автор темы 15 янв 2022 Заблокирован(а) 2 30 июн 2019
    Кароч, не особо силен я в плюсах, но вот хочу что-бы моя прожка запускалась и работала только если запущен процесс с именем, скажем, "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;
    }
    }
    Ну и пытаюсь вызывать ее
    Код

    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);
    Если в
    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", в случае отсутствия такового - завершает работу. Вдруг кому пригодится

    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;
    }
    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);
    }
    }
    }
     
    15 янв 2022 Изменено
  2. wvecov
    wvecov 17 янв 2022 Заблокирован(а) 6 30 сен 2020
    setlocale( LC_ALL,"Russian" )

    а чо?? мало ли
     
    1. BashOrgRu Автор темы
      :liar:
Top
Загрузка...