【问题标题】:C++ LPCTSTR to char*C++ LPCTSTR 到 char*
【发布时间】:2012-04-04 15:25:48
【问题描述】:

我正在使用 Visual Studio 2010 MFC 构建 C++ 程序。我的程序调用了一个不属于项目的 DLL,它接受一个 char*。我有一个函数可以获取 LPCTSTR 格式的字符串。我已经在谷歌上大约两个小时了,但没有找到解决方案。如何将 MFC LPCTSTR 转换为 char*。我发现的所有东西要么不起作用,要么就是无法编译。

【问题讨论】:

  • 你在项目中使用unicode?​​span>

标签: c++ mfc char converter lpcstr


【解决方案1】:

在 MFC 中,最简单的方法是通过 CStringA 进行转换(前提是生成的缓冲区是只读参数):

LPCTSTR pszA = ...
CStringA sB(pszA);
const char* pszC = sB;
char* pszD = const_cast<char*>(pszC);

其他选项可用并进行了讨论:

【讨论】:

  • 如果可以避免的话,永远不要使用CString
  • CString 没有问题。也适用于 ATL(没有 MFC)。
  • 在 MFC 中 CString 是“本机”字符串持有者类,完美运行。 std::string 也很好,并且具有成为 - 从最近开始 - 标准库的一部分的优势。这个问题显然是关于MFC
【解决方案2】:

LPCTSTR 定义为const wchar_t *const char *,具体取决于您的项目是否定义了预处理器符号UNICODE(或_UNICODE,我忘记了使用哪个MFC)。

因此,您的问题的解决方案取决于您是否使用 UNICODE 设置。

如果您正在使用它,您需要将字符串转换为 narrow 字符串。使用CStringA 执行此操作。

如果您不使用 UNICODE,则需要制作一个可变副本并将其传递给 DLL,以防它想要修改字符串。您可以通过使用CString 创建一个副本来做到这一点。

在任何一种情况下,一旦您在 CString 对象中有副本,然后使用 GetBuffer 方法获取指向字符串的可变指针,调用 DLL 函数,然后在调用后调用 ReleaseBuffer

【讨论】:

  • 如果可以避免的话,永远不要使用 CString。使用std::string 进行复制。
  • @DeadMG 如果可以避免,请不要使用 MFC。您如何从std::string 获得char *?在 MFC 世界中玩时使用 MFC 类没有任何问题。
【解决方案3】:
LPCTSTR patientName= L"";
CStringA sB(patientName);
const char* pszC = sB; 

DcmFileFormat fileformat;
//Type casting below to const char * str
OFCondition status = fileformat.loadFile(((LPCSTR)(CStringA)str));
if (status.good())
{
    if (fileformat.getDataset()->findAndGetString(DCM_PatientName, pszC).good())             
    {
        //Type casting from const char * to LPCTSTR
        m_List.InsertColumn(4, LPCTSTR(pszC) , LVCFMT_LEFT, 100); 
    }
 }

这是我用来对变量进行类型转换的方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2012-12-15
    • 1970-01-01
    相关资源
    最近更新 更多