C基本数据类型问题-常量字符*到LPCTSTR

C基本数据类型问题-常量字符*到LPCTSTR,c,winapi,C,Winapi,我已经很好地处理了前三个字段,但遇到了const char*的问题。我试过很多不同的传球和投法,但都没能成功。我在谷歌上搜索了一下,但在Lmsg上找不到什么。我对很多事情都不熟悉。我读过很多书,我认为这可能与编码有关。真正让我困惑的是,LPCTSTR被定义为const char*,但直接类型转换并没有从字段中提供任何信息 我得到一个错误,Lmsg是未声明的,我猜这意味着文本的宏扩展导致了这个错误。我怎样才能让它工作 执行MessageBox(NULL,(LPCTSTR)msg,NULL,NULL

我已经很好地处理了前三个字段,但遇到了const char*的问题。我试过很多不同的传球和投法,但都没能成功。我在谷歌上搜索了一下,但在Lmsg上找不到什么。我对很多事情都不熟悉。我读过很多书,我认为这可能与编码有关。真正让我困惑的是,LPCTSTR被定义为const char*,但直接类型转换并没有从字段中提供任何信息

我得到一个错误,Lmsg是未声明的,我猜这意味着文本的宏扩展导致了这个错误。我怎样才能让它工作


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

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

  • 使用类似于
    MultiByteToWideChar()
    的方法将
    msg
    字符串转换为Unicode。如果因为需要处理代码页和管理用于转换的缓冲区而稍微复杂一些,那么这可能是一种“正确”的方法

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

    #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);
    }
    
  • 这是一个简单的解决办法,如果不是优雅的话


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

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

  • 使用类似于
    MultiByteToWideChar()
    的方法将
    msg
    字符串转换为Unicode。如果因为需要处理代码页和管理用于转换的缓冲区而稍微复杂一些,那么这可能是一种“正确”的方法

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

    #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);
    }
    
  • 这是一个简单的解决办法,如果不是优雅的话


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

    一个
    LPCTSTR
    const TCHAR*
    的别名,而
    TCHAR
    是Windows编程中用来简化ANSI之间转换的类型(,非常类似于国际标准化)和

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

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


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

    一个
    LPCTSTR
    const TCHAR*
    的别名,而
    TCHAR
    是Windows编程中用于简化转换的一种类型ANSI(,非常类似于国际标准化)和

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

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


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

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

    需要注意的是,LPCTSTR并不总是
    const char*
    ,它在ANSI版本中,但在Unicode版本中它是
    const wchar*
    。这很可能就是您遇到的问题

    此外,TEXT()宏仅用于定义字符串常量。不能使用它对变量执行转换,这就是为什么会出现“Lmsg undeclared”


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

    很难确切地说出您的工作情况你的问题,因为你似乎遗漏了一些相关的上下文。例如,LPCTSTR没有提到任何地方,所以我只能猜测你在说什么,或者“前三个字段”是什么

    需要注意的是,LPCTSTR并不总是
    const char*
    ,它在ANSI版本中,但在Unicode版本中它是
    const wchar*
    。这很可能就是您遇到的问题

    此外,TEXT()宏仅用于定义