2015-11-05 83 views
0

我试图将wchar *转换为字符串。首先,我把它当作wstring。当我搜索时,此方法在stackoverflow中指定。但这对我来说不起作用。它出什么问题了?如何将WCHAR *转换为C++中的字符串,反之亦然?

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 
} 
+1

为什么要将宽字符转换为常规字符?宽字符串中任何不能用窄字符串表示的东西都会给你带来垃圾。 – NathanOliver

回答

0

有你的代码的各种问题,最后一个是最严重的:

这看起来很奇怪:

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到这阵你的函数复制过程名里的。

+0

我发送processName指针,将其分配到您谈论的悬挂指针的方法 – Veena

+0

中。但在主要方法_tprintf(TEXT(“PROCESS NAME:%s \ n \ n”),* processName); //正确 – Veena

+0

@Veena - 在此_tprintf之后,您执行使用堆栈覆盖以前数据的代码,其中PROCESSENTRY32 pe32;内容。在main中移动_tprintf更低,你会看到它不再起作用, – marcinj

相关问题