错误C2664:'wsprintfW':无法将参数1从'char *'转换为'LPWSTR'

时间:2014-05-23 11:10:09

标签: c++ visual-c++ visual-studio-2010

我将一些代码从VC6项目复制到v​​c ++ 2010项目,但代码无法编译。  错误是'wsprintfW':无法将参数1从'char *'转换为'LPWSTR',问题代码为:

inline bool RingCtrl::BuildPathAndName(char* pBuf, int bufSize, int8 priority, int idxNumber) const
{
    wsprintf(pBuf, "%s\\R%u%06x.DAT", _directory, (int)priority, idxNumber);
    return true;
}

wsprintfwmcommn.h中的定义如下:

WINUSERAPI
int
WINAPIV
wsprintfA(
    __out LPSTR,
    __in __format_string LPCSTR,
    ...);
WINUSERAPI
int
WINAPIV
wsprintfW(
    __out LPWSTR,
    __in __format_string LPCWSTR,
    ...);
#ifdef UNICODE
#define wsprintf  wsprintfW
#else
#define wsprintf  wsprintfA
#endif 

1 个答案:

答案 0 :(得分:0)

您正在构建定义了UNICODE的程序(在VC ++ 2010中是默认的),而在VC6中没有定义它。定义UNICODE后,wsprintfwchar_t*代替char*作为第一个参数(而const wchar_t*代替const char*作为第二个参数)。

简单的解决方案是在wsprintfA中明确调用wsprintf而不是RingCtrl::BuildPathAndName,但在这种情况下,您会遇到Unicode文件名的问题。您可能会将许多其他类似错误连接到UNICODE_UNICODE,因此您可能希望在VC ++ 2012中更改项目设置:项目属性 - >常规 - &gt ;字符集 - >使用多字节字符集。

正确的解决方案是从char*转移到wchar_t*(甚至更好地转移到TCHAR*),但这可能需要付出很多努力。