2015-03-25 2 views
1

J'utilise QT pour vérifier si le processus est en cours d'exécution et j'ai utilisé le même code dans le site msdn.Vérifiez si le processus est en cours d'exécution - Windows

Cela a fonctionné correctement sur Visual Studio mais j'ai un problème pour le faire fonctionner sur QT.

Voici le code:

bool matchProcessName(DWORD processID, std::string processName) 
{ 
    TCHAR szProcessName[MAX_PATH] = TEXT(L"notepad.exe"); 

// Get a handle to the process. 

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | 
           PROCESS_VM_READ, 
           FALSE, processID); 

// Get the process name. 

if (NULL != hProcess) 
{ 
    HMODULE hMod; 
    DWORD cbNeeded; 

    if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), 
     &cbNeeded)) 
    { 
     GetModuleBaseName(hProcess, hMod, szProcessName, 
          sizeof(szProcessName)/sizeof(TCHAR)); 
    } 
} 

// Compare process name with your string 
bool matchFound = !_tcscmp(szProcessName, processName.c_str()); 

// Release the handle to the process. 
CloseHandle(hProcess); 

return matchFound; 
} 

L'erreur que je reçois est la suivante:

erreur: ne peut pas convertir 'TCHAR *' à 'const char *' pour argument '1' à « int strcmp (const char *, const char *) '

Comment puis-je faire en sorte que cela fonctionne sur QT?

Merci beaucoup.

Mise à jour

J'ai aussi essayé ce code:

DWORD FindProcessId(char* processName) 
{ 

char* p = strrchr(processName, '\\'); 
if(p) 
    processName = p+1; 

PROCESSENTRY32 processInfo; 
processInfo.dwSize = sizeof(processInfo); 

HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  NULL); 
if (processesSnapshot == INVALID_HANDLE_VALUE) 
    return 0; 

Process32First(processesSnapshot, &processInfo); 
if (!strcmp(processName, processInfo.szExeFile)) 
{ 
    CloseHandle(processesSnapshot); 
    return processInfo.th32ProcessID; 
} 

while (Process32Next(processesSnapshot, &processInfo)) 
{ 
    if (!strcmp(processName, processInfo.szExeFile)) 
    { 
     CloseHandle(processesSnapshot); 
     return processInfo.th32ProcessID; 
    } 
} 

CloseHandle(processesSnapshot); 
return 0; 
} 

Je suis aussi obtenir une erreur: ne peut pas convertir 'WCHAR *' à 'const char *' pour l'argument '2' « int strcmp (const char *, const char *) '

Je préfère si je peux faire fonctionner la 2ème méthode!

Merci encore

Répondre

0

Cela n'a rien à voir avec Qt.

Dans le code mis à jour, PROCESSENTRY32.szExeFile est un TCHAR[],

à-dire qu'il est un WCHAR[] si la _UNCODE macro est défini est un autre char[].

Donc, vous devez transférer votre char *processName à TCHAR[] et utiliser _tcscmp(...) pour comparer TCHAR[]. Code modifié:

#include <Windows.h> 
#include <TlHelp32.h> 
#include <tchar.h> 
#include <Psapi.h> 
#include <cstring> 
#include <string> 

#define MIN(x, y) ((x) > (y)) ? (y) : (x) 

void cstringToTCHAR(TCHAR *dst, const char *src, size_t l) { 
#if defined(_UNICODE) || defined(UNICODE 
    mbstowcs(dst, src, l); 
#else 
    memcpy(dst, src, l); 
#endif 
} 

bool matchProcessName(DWORD processID, std::string processName) 
{ 
    TCHAR szProcessName[MAX_PATH] = _T("notepad.exe"); 

    // Get a handle to the process. 

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | 
     PROCESS_VM_READ, 
     FALSE, processID); 

    // Get the process name. 

    if (NULL != hProcess) 
    { 
     HMODULE hMod; 
     DWORD cbNeeded; 

     if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), 
      &cbNeeded)) 
     { 
      GetModuleBaseName(hProcess, hMod, szProcessName, 
       sizeof(szProcessName)/sizeof(TCHAR)); 
     } 
    } 

    // Compare process name with your string 
    TCHAR systemEncodeProcessName[30]; 
    size_t processNameLen = MIN((processName.size() + 1), 30); 
    cstringToTCHAR(systemEncodeProcessName, processName.c_str(), processNameLen); 

    bool matchFound = !_tcscmp(szProcessName, systemEncodeProcessName); 

    // Release the handle to the process. 
    CloseHandle(hProcess); 

    return matchFound; 
} 

DWORD FindProcessId(char* processName) { 

    char* p = strrchr(processName, '\\'); 

    if(p) { 
     processName = p+1; 
    } 

    PROCESSENTRY32 processInfo; 
    processInfo.dwSize = sizeof(processInfo); 

    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 

    if (processesSnapshot == INVALID_HANDLE_VALUE) { 
     return 0; 
    } 

    //Transfer char array to TCHAR array. 
    TCHAR systemEncodeProcessName[30];//Maybe need more or dynamic allocation. 
    size_t processNameLen = MIN((strlen(processName) + 1), 30); 
    cstringToTCHAR(systemEncodeProcessName, processName, processNameLen); 

    Process32First(processesSnapshot, &processInfo); 

    if (!_tcscmp(systemEncodeProcessName, processInfo.szExeFile)) { 
     CloseHandle(processesSnapshot); 
     return processInfo.th32ProcessID; 
    } 

    while (Process32Next(processesSnapshot, &processInfo)) { 
     if (!_tcscmp(systemEncodeProcessName, processInfo.szExeFile)) { 
      CloseHandle(processesSnapshot); 
      return processInfo.th32ProcessID; 
     } 
    } 

    CloseHandle(processesSnapshot); 
    return 0; 
} 

Mise à jour

Dans Qt Creator (3.3.0), les regards _UNICODE macro comme manquant dans la plate-forme Windows, il suffit d'ajouter

DEFINES += _UNICODE 

dans votre .pro fichier, puis exécutez qmake & & build.

+0

J'ai essayé votre code il a retourné l'erreur: impossible de convertir 'TCHAR *' en 'const char *' pour l'argument '1' en 'int strcmp (const char *, const char *)' :( –

+0

J'ai ajouté le mise en œuvre de l'autre fonction, je pense que vous avez juste besoin de la seconde avant – Serge

+0

Je l'ai ajouté mais je reçois la même erreur:/http://prntscr.com/6l4nhf –