我将一个窄字符串转换为宽字符串,如下所示:
string nameOfPrinter;
getline( cin , nameOfPrinter );
wstring WprinterName;
int number = MultiByteToWideChar( CP_UTF8 , 0 , nameOfPrinter.c_str() , nameOfPrinter.size() , &WprinterName , 0 );
// then i make a call to the function whose prototype is callToPrint( LPTSTR , LPVOID , DWORD , string )
// the calling statement is :
callToPrint( WprinterName , -----all other arguments-----,);
// But this call produces the following error error C2664: 'callToPrint' : cannot convert parameter 1 from 'std::wstring' to 'LPTSTR'
为什么会这样?请告诉我如何解决它?
答案 0 :(得分:1)
你还需要在这里使用.c_str()。
另外,我使用
将打印机名称直接读入WprinterNamegetline(wcin, Wprintername);
答案 1 :(得分:0)
你的问题是callToPrint
基本上表明它需要一个可以修改的C字符串,即不是const
。因此,使用LPTSTR
而不是LPTCSTR
VC宏。它是否实际上改变了缓冲区取决于它的实现。现在,w_string.c_str()
会返回const wchar_t*
,根据c_str()的定义,您不得更改(即使您可以将其转换为wchar_t*
,在这种情况下您的代码将编译。
由于callToPrint
以这种方式声明,因此必须为其提供非const C字符串。为此,您可以放弃使用wstring WprinterName
,并使用原始数组wchar_t(或TCHAR,如果您想坚持使用VC类型)。在MultiByteToWideChar
和callToPrint
中使用该缓冲区,并且不要忘记在最后释放它...
如果您确实需要wstring
进行进一步处理,请阅读:Convert std::string to const char* or char*以获取其他一些建议。