2010-07-22 65 views
0
#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 *,但直接类型转换并不能给我任何东西。C基本数据的数据类型的问题 - 为const char *到LPCTSTR

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

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

回答

2

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

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

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

    MessageBoxA(NULL, msg, NULL, NULL); 
    

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

其他选项仅包括构建应用程序以使用Win32 ANSI API而不是Unicode API,或更改您传递的字符串LPTSTR和使用TEXT()_T()宏作为文字。但是,如果你从文件中读取非Unicode数据或elseswhere,那么你仍然必须处理在某一点上转换......

1

LPCTSTRconst TCHAR *的别名,TCHAR是在使用的类型Windows编程以简化ANSI(Windows-1252,非常类似于国际标准化ISO 8859-1)和Unicodetext encodings之间的转换。

如果你的项目设置使用ANSI来构建应用程序,TCHAR真是char,你将能够通过msgMessageBox没有投。

如果您的应用设置使用Unicode(这是什么这听起来像)建,TCHAR真是wchar_t,你将不得不字符串从ANSI使用函数转换为Unicode像MultiByteToWideChar()

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

+0

并非Windows中的所有“ANSI”字符串都是CP-1252。这只是美国英语的默认值。它会因机器而异。由于这个原因,应该避免使用'* A'功能。建立Unicode应用程序。如果您需要转换为传统字符串或从传统字符串转换,请使用带'MultiByteToWideChar' /'WideCharToMultiByte'的'CP_UTF8',因为UTF-8可以表示Unicode可以代表的任何内容。 – asveikau 2011-05-30 11:13:32

1

由于您似乎留下了一些相关背景信息,因此很难确切地说出您的问题发生了什么。例如LPCTSTR在任何地方都没有提到,所以我只能猜测你在说什么,或者前三个字段是什么。

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

另外,TEXT()宏仅用于定义字符串常量。你不能用它来对一个变量进行转换,这就是为什么你得到'Lmsg未声明'。

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