2012-05-21 162 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的转换可能是有损的