繁体   English   中英

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

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

我试图将wchar *转换为字符串。 首先,我将其作为wstring。 搜索时,该方法在stackoverflow中指定。 但这对我来说不起作用。 它出什么问题了?

GetProcessImageNameFromPID.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:  %s\n\n"), *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:  %s\n\n"), *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复制到此数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM