簡體   English   中英

E0167 “CHAR *”類型的參數與“const wchar_t *”類型的參數不兼容

[英]E0167 argument of type "CHAR *" is incompatible with parameter of type "const wchar_t *"

我正在編寫一個允許我在流程上畫線的項目,但我遇到了 2 個錯誤:

E0167: argument of type "CHAR *" is incompatible with parameter of type "const wchar_t *" 
C2664: 'int _wcsicmp(const wchar_t *,const wchar_t *)': cannot convert argument 1 from 'CHAR [260]' to 'const wchar_t *'

我已將項目設置從 Unicode 更改為多字節。 它解決了這個問題,但是在切換它之后,我在代碼的另一部分出現了另一個錯誤。

這是來源:

DWORD GetProcId(const wchar_t* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap != INVALID_HANDLE_VALUE) {
        
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!_wcsicmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));
        }
    }
}

uintptr_t GetModuleBaseAddress(DWORD dwPid, const char* moduleName) {
    uintptr_t dwBase = 0;
    do {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPid);
        if (hSnapshot == INVALID_HANDLE_VALUE) { continue; }
        MODULEENTRY32 ModuleEntry32;
        ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
        if (Module32First(hSnapshot, &ModuleEntry32)) {
            do {
                if (!strcmp(ModuleEntry32.szModule, (LPSTR)moduleName)) {
                    dwBase = (DWORD)ModuleEntry32.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnapshot, &ModuleEntry32));
        }
        CloseHandle(hSnapshot);
    } while (!dwBase);
    return dwBase;
}

當字符集在Unicode上時, if (._wcsicmp(procEntry,szExeFile, procName))不會給我任何錯誤。 但是,在GetModuleBase()中, if ( ModuleEntry32 if (.strcmp(ModuleEntry32,szModule, (LPSTR)moduleName))中的 ModuleEntry32 給了我上面顯示的兩個錯誤。

當我將字符集設置為多字節時,錯誤切換到procEntry in line if (._wcsicmp(procEntry,szExeFile, procName))

我似乎無法弄清楚這個問題。 它一直告訴我argument of type "CHAR *" is incompatible with parameter of type "const wchar_t*"

首先,您的GetProcId()有問題。 它正在泄漏快照HANDLE ,實際上並沒有return進程 ID。

話雖如此 -

您將char / wchar_t字符串與TCHAR API 混合在一起,但它們並不意味着混合。

定義UNICODE時, TCHAR映射到wchar_tPROCESSENTRY32映射到PROCESSENTRY32WProcess32First()映射到Process32FirstW()等。

否則,當UNICODE未定義時, TCHAR映射到charPROCESSENTRY32映射到PROCESSENTRY32AProcess32First()映射到Process32FirstA()等。

因此,如果要使用基於TCHAR的 Win32 API 函數,則需要使用TCHAR字符串和基於TCHAR的字符串比較(即_tcsicmp() ),例如:

DWORD GetProcId(const TCHAR* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap != INVALID_HANDLE_VALUE) {
        
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!_tcsicmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));
        }

        CloseHandle(hSnap);
    }

    return procId;
}

uintptr_t GetModuleBaseAddress(DWORD dwPid, const TCHAR* moduleName) {
    uintptr_t dwBase = 0;
    do {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPid);
        if (hSnapshot == INVALID_HANDLE_VALUE) { continue; }
        MODULEENTRY32 ModuleEntry32;
        ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
        if (Module32First(hSnapshot, &ModuleEntry32)) {
            do {
                if (!_tcsicmp(ModuleEntry32.szModule, moduleName)) {
                    dwBase = (DWORD)ModuleEntry32.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnapshot, &ModuleEntry32));
        }
        CloseHandle(hSnapshot);
    } while (!dwBase);
    return dwBase;
}

否則,當使用顯式char / wchar_t字符串時,您需要直接使用 Unicode/ANSI API,例如:

DWORD GetProcId(const wchar_t* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap != INVALID_HANDLE_VALUE) {
        
        PROCESSENTRY32W procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32FirstW(hSnap, &procEntry))
        {
            do
            {
                if (!_wcsicmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32NextW(hSnap, &procEntry));
        }

        CloseHandle(hSnap);
    }

    return procId;
}

uintptr_t GetModuleBaseAddress(DWORD dwPid, const char* moduleName) {
    uintptr_t dwBase = 0;
    do {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPid);
        if (hSnapshot == INVALID_HANDLE_VALUE) { continue; }
        MODULEENTRY32A ModuleEntry32;
        ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
        if (Module32FirstA(hSnapshot, &ModuleEntry32)) {
            do {
                if (!strcmp(ModuleEntry32.szModule, moduleName)) {
                    dwBase = (DWORD)ModuleEntry32.modBaseAddr;
                    break;
                }
            } while (Module32NextA(hSnapshot, &ModuleEntry32));
        }
        CloseHandle(hSnapshot);
    } while (!dwBase);
    return dwBase;
}

暫無
暫無

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

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