如何在C++中将WCHAR*转换为字符串,反之亦然

How to convert WCHAR* to string in C++ and vice versa?

本文关键字:转换 字符串 反之亦然 WCHAR C++ 中将      更新时间:2023-10-16

我试图将wchar*转换为字符串。首先我把它做成了wstring。当我搜索时,这个方法是在stackoverflow中指定的。但这对我来说不起作用。它怎么了?

从PID.cpp 获取处理图像名称

     BOOL GetProcessImageNameFromPID::getProcessNameFromProcessID(DWORD processId, WCHAR**processName)
        {
            HANDLE hProcessSnap;
            HANDLE hProcess;
            PROCESSENTRY32 pe32;
            DWORD dwPriorityClass;
            // Take a snapshot of all processes in the system.
            hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
            if (hProcessSnap == INVALID_HANDLE_VALUE)
            {
                printError(TEXT("CreateToolhelp32Snapshot (of processes)"));
                return(FALSE);
            }
        // Set the size of the structure before using it.
        pe32.dwSize = sizeof(PROCESSENTRY32);
        // Retrieve information about the first process,
        // and exit if unsuccessful
        if (!Process32First(hProcessSnap, &pe32))
        {
            printError(TEXT("Process32First")); // show cause of failure
            CloseHandle(hProcessSnap);          // clean the snapshot object
            return(FALSE);
        }
        // Now walk the snapshot of processes, and
        // display information about each process in turn
        int i = 0;
        do
        {
            WCHAR*allprocessName = pe32.szExeFile;
            //_tprintf( TEXT("n%d)PROCESS NAME:  %s"), i, allprocessName);
            // Retrieve the priority class.
            dwPriorityClass = 0;
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
            if (hProcess == NULL)
                printError(TEXT("OpenProcess"));
            else
            {
                dwPriorityClass = GetPriorityClass(hProcess);
                if (!dwPriorityClass)
                    printError(TEXT("GetPriorityClass"));
                CloseHandle(hProcess);
            }
            DWORD pid = pe32.th32ProcessID;
            //_tprintf( TEXT("n  Process ID        = %d"), pid );
            if (pid == processId)
            {
                *processName = allprocessName;
                //_tprintf( TEXT("Inside Method:n"));
                _tprintf(TEXT("PROCESS NAME:  %snn"), *processName);
                return TRUE;
            }
            i++;
        } while (Process32Next(hProcessSnap, &pe32));
        CloseHandle(hProcessSnap);
        return(FALSE);
    }
int _tmain(int argc, _TCHAR* argv[])
{
    WCHAR**processName = (WCHAR**)malloc(sizeof(WCHAR));
    GetProcessImageNameFromPID::getProcessNameFromProcessID(4, processName);
    _tprintf(TEXT("PROCESS NAME:  %snn"), *processName); // correct
            GetProcessImageNameFromPID::getProcessNameFromProcessID(executionProcessID, processName);
            wstring ws(*processName);
            string str(ws.begin(), ws.end());
            processImageName = str;
            cout << processImageName << endl; // some wrong characters are printed
}

您的代码存在各种问题,最后一个问题最严重:

这看起来很奇怪:

WCHAR**processName = (WCHAR**)malloc(sizeof(WCHAR));

我想你想要一个指向WCHAR*的指针,为什么不呢:

WCHAR* processName;

然后:

GetProcessImageNameFromPID::getProcessNameFromProcessID(4, &processName);
                                                           ^~~~~ !!

processImageName的类型是什么?进程的名称是什么,如果它包含非ASCII字符,那么您的转换代码将给出错误的字符。

另一个是代码:

*processName = allprocessName;

使*processName等于函数结束后悬挂指针的指针,它指向中的WCHAR数组

PROCESSENTRY32 pe32;

它是在堆栈上创建的。

您应该做的是使processName成为一个数组:

WCHAR processName[MAX_PATH];

在函数内部,将进程名称从pe32复制到此数组。