c++ - 检查进程是否正在运行 - Windows

标签 c++ qt qt4 qt-creator

我正在使用 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*)”

如果我能让第二种方法起作用,我更喜欢!

再次感谢

最佳答案

与Qt无关

在更新的代码中,PROCESSENTRY32.szExeFile 是一个TCHAR[]

即如果定义了宏 _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。

关于c++ - 检查进程是否正在运行 - Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246124/

相关文章:

c++ - 在 QWidget 的子类上使用 setCentralWidget?

c++ - 在 C++ 中存储数据的最佳方式

c++ - 为什么要使用十六进制?

c++ - 从输入文件中读取多行

用于提取 .zip 文件的 C++ 包装器代码?

c++ - 如何从 QGraphicsItem 中的上下文菜单运行函数

c++ - 如何使用 QT Creator 在 LineEdit 中写入和读取文本?

c++ - 在 C++ 中遍历成对(或更多)对象

c++ - C++代码中如何灵活使用和替换std::shared_ptr或std::unique_ptr或裸指针?

qt - QStackedWidget 从一页到另一页的导航