3

可能重复:
将 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;
}

提前致谢。

4

3 回答 3

6

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 );

此外,此链接可以提供帮助:

将 lptstr 转换为 char*

于 2012-05-21T09:26:01.850 回答
2

首先,您定义char* ch[MAX_PATH]而不是char ch[MAX_PATH].

关于您的问题,如果它是 unicode,则 LPTSTR ( Long Pointer to TCHAR String ) 等效于LPWSTR(which is w_char*),如果不是,则等效于 LPSTR ( char*)。您可以使用此链接作为有关每种情况下转换的参考。

编辑:切入正题,这里有一些代码:

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
于 2012-05-21T09:14:26.017 回答
2

LPTSTR意思TCHAR*(扩展那些 Win32 首字母缩写词 typedef 可以更容易理解它们)。TCHAR扩展到charANSI/MBCS 构建和wchar_tUnicode 构建(这应该是这些天的默认设置,以获得更好的国际化支持)。

下表总结了TCHARANSI/MBCS 和 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]char是ANSI 和 Unicode 版本中的 '数组。

如果要从TCHAR字符串 ( LPTSTR) 转换为 ANSI/MBCS 字符串(char基于 -),可以使用ATL 字符串转换助手,例如:

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

(另请注意,在您的原始代码中,您应该调用CString::ReleaseBuffer()which 是 的对称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 的转换可能是有损的。

于 2012-05-21T10:35:36.033 回答