我正在使用Windows函数CreateToolhelp32snapshot枚举计算机上正在运行的进程。它返回的pe32.szeFileName字段是WCHAR,这是可执行文件的名称。

我想将每个可执行文件的名称与我生成的一堆可执行文件进行比较,如下所示:

WCHAR* processNames[numProcesses] = { "word", "excel", "outlook, ...}


不幸的是,我不知道如何检查此processNames数组的任何元素是否是从WCHAR返回的pe32.szeFilename的子字符串。

我知道如果我处理两个wcsstr字符串,const wchar_t *会起作用。如何将WCHAR返回的pe32.szeFilename与字符串数组的每个元素进行比较?具体来说,我想看看数组中的任何字符串(任何格式的格式都可以)是否是WCHAR的子字符串。

编辑:我当前的循环:

do {

    wprintf(L"Process name: %s\n", pe32.szExeFile);
    for (int i = 0; i < numProcesses; ++i) {
        if (wcsstr(pe32.szExeFile, processNames[i])) {
            // Found it
            wprintf("%s", pe32.szExeFile);

        }
    }

} while (Process32Next(hProcessSnap, &pe32));

最佳答案

unicode标记的问题,所以我想,您应该尝试将所有文​​字的声明更改为L"characters",例如:

WCHAR* processNames[numProcesses] = { L"word", L"excel", L"outlook", ...}


然后检查是否使用了适当的unicode函数,例如定义了UNICODE或使用了W的函数名称:

Process32FirstW(hProcessSnap, &pe32);
. . .
Process32NextW(hProcessSnap, &pe32);


最后(从那开始,也许这可以让您查看if条件的结果),对L"%s"使用wprintf

wprintf(L"%s", pe32.szExeFile);


更新:

为了检查wprintf的行为,我写了一小段代码(使用了Visual Studio 2013),因此

#include <tchar.h>
#include <windows.h>

int main(void)
{
    WCHAR* procName = L"excel";

    WCHAR* processNames[3] = { L"word", L"excel", L"outlook" };

    wprintf(L"Process name: %s\n", procName);
    for (int i = 0; i < 3; ++i) {
       if (wcsstr(procName, processNames[i])) {
           wprintf("%s", procName);
       }
    }
    return 0;
}





  流程名称:excel


(即if的状态为假),

但是代码(在循环内为L仅添加了一个wprintf

#include <tchar.h>
#include <windows.h>

int main(void)
{
    WCHAR* procName = L"excel";

    WCHAR* processNames[3] = { L"word", L"excel", L"outlook" };

    wprintf(L"Process name: %s\n", procName);
    for (int i = 0; i < 3; ++i) {
       if (wcsstr(procName, processNames[i])) {
           wprintf(L"%s", procName);
       }
    }
    return 0;
}


表演


  流程名称:excel
  
  擅长

关于c - 查看WCHAR *是否为C中WCHAR的子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44234435/

10-11 19:44