C基本数据类型问题 - const char *到LPCTSTR

时间:2010-07-22 16:39:09

标签: c winapi

#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 *的问题。我试过很多不同的方式传递和投射,但无法让它发挥作用。我用Google搜索,但在Lmsg上找不到多少。我是新来的很多。我已阅读过,我认为这可能与编码有关。让我感到困惑的是LPCTSTR被定义为一个const char *,但直接的类型转换并没有给我任何东西。

我得到一个Lmsg未声明的错误,我猜这意味着TEXT的宏扩展导致了这个问题。我怎样才能使这个工作?

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

3 个答案:

答案 0 :(得分:2)

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

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

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

    MessageBoxA(NULL, msg, NULL, NULL); 
    
  3. 这是一个简单的解决方法,如果不是优雅的话。

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

答案 1 :(得分:1)

答案 2 :(得分:1)

很难确切地说出你问题中发生了什么,因为你似乎已经离开了一些相关的背景。例如LPCTSTR在任何地方都没有提到,所以我只能猜测你在说什么,或者说“前三个字段”是什么。

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

此外,TEXT()宏仅用于定义字符串常量。你不能用它来对变量进行转换,这就是你得到'Lmsg未声明'的原因。

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