2013-09-23 2 views
1

Я пытаюсь вернуть идентификатор процесса, и у меня есть этот код. Что я делаю неправильно?Return PID По имени

Кодекс:

DWORD GetProcId(char* ProcName)//Get ProcessId By Name 
{ 
    PROCESSENTRY32 pe32; 
    HANDLE   hSnapshot = NULL; 
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if(Process32First(hSnapshot, &pe32)) 
    { 
     do{ 
      if(strcmp(pe32.szExeFile, ProcName) == 0) 
      { 
       return pe32.th32ProcessID; 
      } 
     }while(Process32Next(hSnapshot, &pe32)); 
    } 

    if(hSnapshot != INVALID_HANDLE_VALUE) 
     CloseHandle(hSnapshot); 
    return 0; 

} 

И ошибка 'strcmp' : cannot convert parameter 1 from 'WCHAR [260]' to 'const char *'

Как я могу это исправить, я пытался несколько различных преобразований, но не смог этого сделать.

ответ

0

Вы пытаетесь сравнить широкую строку символов с узкой символьной строкой. Поскольку ProcName - это строчная строка символов, то должно быть, что pe32.szExeFile - это широкая строка символов. Не удивительно, поскольку Windows использует широкие символы внутри. Вы должны изменить char* ProcName на wchar_t* ProcName и использовать wcscmp вместо strcmp.

1

pe32.szExeFile, по-видимому, строка WCHAR, а не нормальная строка char * C. Вам нужно будет преобразовать его перед сравнением. В качестве альтернативы преобразуйте ProcName в строку WCHAR, а затем используйте функцию сравнения строк.

Быстрая проверка Visual Studio documentation показывает, что вы можете найти функцию wcscmp.

+0

+1 Для преобразования ProcName в wchar *, OP должен идти вперед и объявлять большинство строк wchar, если он собирается иметь дело с winapi на некоторое время. – Adam

Смежные вопросы