【问题标题】:C basic datatype problem - const char * to LPCTSTRC 基本数据类型问题 - const char * 到 LPCTSTR
【发布时间】:2010-07-22 16:39:09
【问题描述】:
#include "stdafx.h"
#include "string.h"
#include "windows.h"
bool SCS_GetAgentInfo(char name[32],char version[32], char description[256], const char * dwAppVersion)
{
    strcpy(name,gName);
    strcpy(version,gVersion);
    strcpy(description,gDescription);
    notify(dwAppVersion);
    return true;
}

void notify(const char * msg)
{
    MessageBox(NULL, TEXT(msg), NULL, NULL);
}

我已经成功地处理了前三个字段,但是我遇到了 const char * 的问题。我尝试过以很多不同的方式传递和投射,但无法让它发挥作用。我四处搜索,但在 Lmsg 上找不到太多信息。我对此很陌生。我已经阅读过,我认为这可能与编码有关。真正让我困惑的是 LPCTSTR 被定义为 const char *,但直接类型转换并没有给我任何来自该领域的东西。

我收到一个错误,指出 Lmsg 未声明,我猜这意味着 TEXT 的宏扩展导致了这种情况。我怎样才能让它工作?

执行MessageBox(NULL, (LPCTSTR)msg, NULL, NULL); 反而会给我一堆框,表明它可能引用了错误的字符,但是将 dwAppsVersion 参数复制到描述中会显示正确的信息。

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    问题是您正在构建应用程序以使用 UNICODE Win32 API,但您正在传递非 UNICODE 字符串。你有两个选择:

    1. 使用MultiByteToWideChar() 之类的东西将msg 字符串转换为Unicode。这可能是“正确”的方法,虽然有点复杂,因为您需要处理代码页并管理用于转换的缓冲区。

    2. 您可以强制使用 ANSI 版本的 API:

      MessageBoxA(NULL, msg, NULL, NULL); 
      

    这是一个简单的解决方法,即使不优雅。

    其他选项包括仅构建应用程序以使用 Win32 ANSI API 而不是 Unicode API,或将您传递的字符串更改为 LPTSTR 并为您的文字使用 TEXT()_T() 宏。但是,如果您正在从文件或其他地方读取非 Unicode 数据,那么您仍然需要在某些时候处理转换...

    【讨论】:

      【解决方案2】:

      LPCTSTRconst TCHAR * 的别名,TCHAR 是 Windows 编程中用于简化 ANSI(Windows-1252,非常类似于国际标准化的ISO 8859-1)和 @ 之间转换的类型987654323@text encodings.

      如果您的项目设置为使用 ANSI 构建您的应用程序,TCHAR 实际上是 char,您可以将 msg 传递给 MessageBox 而无需强制转换。

      如果您的应用设置为使用 Unicode 构建(听起来就是这样),TCHAR 实际上是 wchar_t,您必须使用类似 MultiByteToWideChar() 的函数将字符串从 ANSI 转换为 Unicode .

      简单的强制转换只是强制编译器以不同的方式解释类型而不更改数据;在这种情况下,这还不够,因为实际数据必须从一种格式转换为另一种格式。

      【讨论】:

      • 并非 Windows 中的所有“ANSI”字符串都是 CP-1252。这只是美国英语的默认设置。它会因机器而异。因此,应避免使用*A 函数。构建 Unicode 应用程序。如果您需要与旧字符串相互转换,请使用 CP_UTF8MultiByteToWideChar/WideCharToMultiByte,因为 UTF-8 可以表示 Unicode 可以表示的任何内容。
      【解决方案3】:

      由于您似乎遗漏了一些相关的上下文,因此很难准确说出您的问题中发生了什么。例如 LPCTSTR 没有在任何地方提及,所以我只能猜测您在说什么,或者“前三个字段”是什么。

      需要注意的一点是,LPCTSTR 并不总是 const char*,它在 ANSI 构建中,但在 Unicode 构建中它是 const wchar_t*。这很可能是您遇到的问题。

      另外,TEXT() 宏仅用于定义字符串常量。您不能使用它对变量执行转换,这就是您得到“未声明 Lmsg”的原因。

      如果您不是有意使用 Unicode 构建,您可能希望将项目设置更改为 ANSI 构建作为解决方法。否则,您可能需要阅读有关使用 Unicode 的教程,如果您现在正在为 Windows 编写软件,那么您应该熟悉该教程。

      【讨论】:

        猜你喜欢
        • 2011-09-29
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多