【问题标题】:Check if process is running - Windows检查进程是否正在运行 - Windows
【发布时间】:2015-05-28 13:27:20
【问题描述】:

我正在使用 QT 检查进程是否正在运行,并且我在 msdn 站点中使用了相同的代码。

在 Visual Studio 上运行良好,但在 QT 上运行时遇到问题。

代码如下:

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;
}

我得到的错误是这样的:

错误:无法将参数 '1' 的 'TCHAR*' 转换为 'const char*' 到 'int strcmp(const char*, const char*)'

如何在 QT 上完成这项工作?

非常感谢。

更新

我也试过这段代码:

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;
}

我也收到一个错误:无法将参数 '2' 的 'WCHAR*' 转换为 'const char*' 到 'int strcmp(const char*, const char*)'

如果我可以使第二种方法起作用,我更喜欢!

再次感谢

【问题讨论】:

    标签: c++ qt qt4 qt-creator


    【解决方案1】:

    与Qt无关。

    在更新后的代码中,PROCESSENTRY32.szExeFileTCHAR[]

    即如果定义了宏_UNCODE,则为WCHAR[],否则为char[]

    所以你必须将你的char *processName 转移到TCHAR[] 并使用_tcscmp(...) 来比较TCHAR[]。 修改代码:

    #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;
    }
    

    更新

    在 Qt creator(3.3.0) 中,_UNICODE 宏在 Windows 平台中似乎缺失,只需添加

    DEFINES += _UNICODE
    

    在您的 .pro 文件中,然后运行 ​​qmake && build。

    【讨论】:

    • 我试过你的代码它返回错误:无法将参数 '1' 的 'TCHAR*' 转换为 'const char*' 到 'int strcmp(const char*, const char*)' :(
    • 我已经添加了其他功能的实现,我认为您只需要之前的第二个。
    • 哦,你添加的最后一次更新解决了我的问题。大声笑我有Qt4,这就是为什么我没有考虑到它!所以基本上添加“DEFINES += _UNICODE”解决了我的问题!谢谢!