2012-05-21 198 views
2

可能重複:
Convert lptstr to char*C++:轉換LPTSTR爲char陣列

我需要轉換的LPTSTR pCHAR ch[]。我是C++新手。

#include "stdafx.h" 
#define _WIN32_IE 0x500 
#include <shlobj.h> 
#include <atlstr.h> 
#include <iostream> 
#include <Strsafe.h> 

using namespace std; 

int main(){ 
    int a; 
    string res; 
    CString path; 
    char ch[MAX_PATH]; 
    LPTSTR p = path.GetBuffer(MAX_PATH); 
    HRESULT hr = SHGetFolderPath(NULL,CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, p); 

/* some operation with P and CH */ 

    if(SUCCEEDED(hr)) 
    { /* succeeded */ 
     cout << ch; 
    } /* succeeded */ 
    else 
    { /* failed */ 
     cout << "error"; 
    } /* failed */ 
    cin >> a; 
    return 0; 
} 

在此先感謝。

+2

http://stackoverflow.com/questions/342772/convert-lptstr-to-char – triclosan

回答

5

LPTSTR是一個(非常量)TCHAR字符串。取決於它是否是Unicode。如果不是Unicode,則LPTSTR是char *,如果是,則爲w_char *。

如果使用非Unicode字符串LPTSTR只是一個char *,否則做:

size_t size = wcstombs(NULL, p, 0); 
char* CharStr = new char[size + 1]; 
wcstombs(CharStr, p, size + 1); 

而且,這個鏈接可以幫助:

Convert lptstr to char*

+0

我有錯誤錯誤C2664:'wcstombs':無法將參數2從'LPTSTR'轉換爲'const wchar_t *' –

+0

您有非Unicode字符串,在這種情況下您不需要使用wcstombs()。只需使用簡單的轉換即可char *。 –

+0

+1'LPTSTR是char *,如果不是Unicode的話,或者w_char *如果是的話。「直到我遇到這個小小的清晰度,這是一段相當長的時間。在http://www.kerwal.com/home/charwchartwchartcharomgwtftmi快速,有用的總結。 – Ben

2

首先,您定義了char* ch[MAX_PATH]而不是char ch[MAX_PATH]

關於你的問題,LPTSTR(長指針,TCHAR字符串)相當於LPWSTR(這是w_char*),如果是unicode的,或者只是LPSTR(char*),如果它不是。您可以使用this link作爲每種情況下的轉換參考。

編輯:要切入正題,下面是一些代碼:

if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode 
    strcpy(ch, (char*)(p));  
else        // String is unicode 
    wcstombs(ch, p, MAX_PATH); 

編輯2:在Windows中我會建議使用的TCHAR代替char。它會爲你節省一些頭痛。

編輯3:作爲一個方面說明,如果你想阻止的Visual Studio淹沒了有關不安全功能的警告,你可以添加類似下面給你的代碼的開始:

#ifdef _MSC_VER 
#define _CRT_SECURE_NO_WARNINGS 
#endif 
+0

你可以寫一些代碼嗎? –

+0

@Sasha我給你應該已經覆蓋它,但請務必參考。我在示例代碼中添加了示例代碼。 –

+1

我認爲ATL轉換助手使代碼更容易。此外,如果你想對Unicode做一次檢查與ANSI/MBCS版本,我寧願用'UNICODE/_UNICODE'預處理宏預處理_at編譯time_(這是'#define''d在Unicode版本檢查),而不是在運行時用'如果(的sizeof(TCHAR)==的sizeof(char)的)...'檢查。 – 2012-05-21 11:25:32

2

LPTSTR意味着TCHAR*(擴大這些Win32首字母縮略詞typedefs可以使它更容易理解它們)。 TCHAR在ANSI/MBCS版本中擴展爲char,在Unicode版本中擴展爲wchar_t(爲了更好的國際化支持,這應該是默認值)。

下表總結在ANSI/MBCS的TCHAR膨脹和Unicode版本

  | ANSI/MBCS |  Unicode 
    --------+----------------+----------------- 
    TCHAR |  char  |  wchar_t 
    LPTSTR |  char*  |  wchar_t* 
    LPCTSTR | const char* | const wchar_t* 

所以,在ANSI/MBCS構建,LPTSTR擴展爲char*;在Unicode版本中,它擴展爲wchar_t*

char ch[MAX_PATH]是ANSI和Unicode版本中的char的數組。

如果你想從TCHAR字符串(LPTSTR)到ANSI/MBCS字符串(char基)相互轉換,你可以使用ATL string conversion helpers,如:

LPTSTR psz; // TCHAR* pointing to something valid  
CT2A ch(psz); // convert from TCHAR string to char string 

(另請注意,在你的原代碼,你應該調用CString::ReleaseBuffer()這是CString::GetBuffer()對稱)

示例代碼如下:

// Include ATL headers to use string conversion helpers 
#include <atlbase.h> 
#include <atlconv.h> 
... 

LPTSTR psz = path.GetBuffer(MAX_PATH); 
HRESULT hr = SHGetFolderPath(NULL,CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, psz); 
path.ReleaseBuffer(); 
if (FAILED(hr)) 
{ 
    // handle error 
    ... 
} 

// Convert from TCHAR string (CString path) to char string. 
CT2A ch(path); 

// Use ch... 
cout << static_cast<const char*>(ch) << endl; 

另請注意,從Unicode到ANSI的轉換可能是有損的