#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参数复制到说明中会显示正确的信息。
答案 0 :(得分:2)
问题是您正在构建应用程序以使用UNICODE Win32 API,但是您传递的是非UNICODE字符串。您有两种选择:
使用msg
之类的内容将MultiByteToWideChar()
字符串转换为Unicode。这可能是“正确”的方法,如果有点复杂,因为你需要处理代码页并管理用于转换的缓冲区。
您可以强制使用ANSI的ANSI版本:
MessageBoxA(NULL, msg, NULL, NULL);
这是一个简单的解决方法,如果不是优雅的话。
其他选项包括仅构建应用程序以使用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编写软件,那么您应该熟悉它。