簡體   English   中英

參數類型“WCHAR *”與類型“const char *”的參數不兼容

[英]Argument type “WCHAR *” is incompatible with parameter of type “const char *”

在下面的論壇中找到了這個有用的代碼,但它在這一行引發了錯誤

if (stricmp(entry.szExeFile, "target.exe") == 0)

參數類型“WCHAR *”與類型“const char *”的參數不兼容。

我正在使用 Visual Studio 2019。

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>

void EnableDebugPriv()
{
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = luid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);

    CloseHandle(hToken);
}

int main(int, char* [])
{
    EnableDebugPriv();

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

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (stricmp(entry.szExeFile, "target.exe") == 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);

                // Do stuff..

                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);

    return 0;
}

您正在編譯項目,其字符集選項設置為 Unicode,因此Process32First()Process32Next() map 到它們的WCHAR[]版本,因此是entry.szExeFile

但是stricmp()取而代之的是char輸入,這就是代碼無法編譯的原因。

您需要改用 stricmp 的stricmp版本,即wcsicmp()_wcsicmp() ,例如:

if (wcsicmp(entry.szExeFile, L"target.exe") == 0)

或者更好的是,在<tchar.h>中使用_tcsicmp() ,因為您實際上使用的是Process32...函數的TCHAR版本,例如:

if (_tcsicmp(entry.szExeFile, _T("target.exe")) == 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM