繁体   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