C++ ';常量字符*';和';WCHAR*';

C++ ';常量字符*';和';WCHAR*';,c++,C++,这是我第一次制作一个外部游戏黑客应用程序,我正在用一些东西进行巡回演出 我的问题:无法在参数传递中将“const char*”转换为“WCHAR*” 我已经尝试将字符集更改为多字节,但仍然显示错误 #include <iostream> #include <Windows.h> #include <TlHelp32.h> HANDLE hProc = NULL; DWORD pID; bool attachProc(char* procName) {

这是我第一次制作一个外部游戏黑客应用程序,我正在用一些东西进行巡回演出

我的问题:无法在参数传递中将“const char*”转换为“WCHAR*”

我已经尝试将字符集更改为多字节,但仍然显示错误

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

HANDLE hProc = NULL;
DWORD pID;

bool attachProc(char* procName)
{
    PROCESSENTRY32 procEntry32;
    procEntry32.dwSize = sizeof(PROCESSENTRY32);
    
    auto hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcSnap == INVALID_HANDLE_VALUE) 
    {
        std::cout << "Snapshot failed :((" << std::endl;
        return false;
    }

    while (Process32Next(hProcSnap, &procEntry32))
    {
        std::cout << procEntry32.szExeFile << std::endl;

        if (!strcmp(procName, procEntry32.szExeFile)) //ERROR RIGHT THERE
        {
            std::cout << "Process found: " << procEntry32.szExeFile << " Process id: " << procEntry32.th32ProcessID << std::endl;
            hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procEntry32.th32ProcessID);
            pID = procEntry32.th32ProcessID;

            if (hProc == NULL)
            {
                std::cout << "Process handling failed." << std::endl;
            }

            CloseHandle(hProcSnap);
            return true;
        }
    }
    std::cout << "Couldn't find " << procName << " in the process snapshot." << std::endl;
    CloseHandle(hProcSnap);
    return false;
}

template <class dataType>
void wpm(dataType valToWrite, DWORD addressToWrite) {
    WriteProcessMemory(hProc, (PVOID)addressToWrite, &valToWrite, sizeof(dataType), 0);
}

template <class dataType>
void rpm(DWORD addressToRead)
{
    dataType rpmBuffer;

    ReadProcessMemory(hProc, (PVOID)addressToRead, rpmBuffer, sizeof(dataType), 0);

    return rpmBuffer;
}

int main()
{

    DWORD memoryAddress;
    attachProc((char*)"hl2.exe");
}
#包括
#包括
#包括
HANDLE hProc=NULL;
德沃德pID;
bool attachProc(char*procName)
{
进程32进程32;
procEntry32.dwSize=sizeof(PROCESSENTRY32);
auto hProcSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcSnap==无效的\u句柄\u值)
{

std::cout您应该得到一个错误。首先,
const char*
可以与
const WCHAR*
兼容,而不是
WCHAR*

另一件事,通常在Windows中,WCHAR字符代表
utf-16
字符,
ascii
字符与
utf-16
不同。Windows有一个内置函数,可将
utf-8
ascii
转换为
utf-16
,如下所示:

const auto result=MultiByteToWideChar(
CP_机场核心计划,
MB_ERR_无效字符,
在这里,
你的尺寸在这里
您的targetStringhere,
您的targetStringSize在此
);
而且,C标准库有一个等价的实现-

std::mbstowcs(wchar\u t*dst,const char*src,std::size\u t len);

没有问题。似乎您遗漏了什么。请引用完整的错误消息,包括错误之前的消息和警告。您不应该在声明的位置获得声明的错误。请将您的问题包括在内,并将完整的生成输出复制粘贴到问题中。除此之外,我打赌您将使用宏
UNICODE
已定义,这意味着所有标准Windows API函数将默认为宽字符变体(使用
WCHAR
而不是
char
)如果你想将标准C++函数与Windows API函数混合,那么你需要在构建时删除<代码> Unicode < /Code >宏,或者明确使用<代码> A/Eng>后缀函数(使用窄字符<代码> char < /Code >)。首先,为什么在函数
rpm
中返回一些东西,而它没有指定数据类型?其次,将“hl2.exe”强制转换为
char*
是完全无用的,因为它已经是
const char*
第三,
PROCESSENTRY32
是一个结构,其中变量
szExeFile
char[]
type。我自己试过了,效果很好。我认为这很可能是一个bug,除非你使用
PROCESSENTRY32W
,我对此表示怀疑。@Someprogrammerdude如果这个错误是由UNICODE构建引起的(即使用
PROCESSENTRY32W
),那么这个错误将是“另一种情况”-我认为,将
WCHAR*
转换为
const char*