无法将CHAR转换为LPWSTR

时间:2015-06-17 02:29:13

标签: c++ lpwstr

我在Visual Studio 2015中遇到编译错误,我正在尝试将char数据转换为LPWSTR。我可以吗?或者它只适用于字符串类型?

这是我的一段代码:

    ⋮
FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    GetCurrentDirectory(256, fichier); 
    strcat(fichier, "\\fichierlog.txt");

在发布我的问题之前,我在:

  1. https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k%28C2664%29&rd=true

  2. C++ cannot convert from enum to LPCTSTR

  3. How to Convert char* to LPWSTR in VC++?

  4. 我没有找到我的案子:(

3 个答案:

答案 0 :(得分:3)

而不是您当前的代码:

FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    GetCurrentDirectory(256, fichier); 
    strcat(fichier, "\\fichierlog.txt");

做例如。

auto main() -> int
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    std::wstring fichier( MAX_PATH, L'\0' );//   <--- HERE s my char table
    const DWORD len = GetCurrentDirectory( fichier.size(), &fichier[0] );
    if( len == 0 || len >= fichier.size() ) { throw std::runtime_error( "GetCurrentDirectory failed." ); }
    fichier.resize( len );
    fichier += L"/fichierlog.txt";

    std::ifstream sortie( fichier );

这应解决三个问题:

  • 您正在编译为Unicode(可能是Visual Studio项目),但代码是针对Windows ANSI API的。

  • 您使用的是C ++编译器,但代码是C级低级。

  • 用于最大路径长度的缓冲区太小,以及可能的连接缓冲区溢出。

请注意,接受宽字符串的ifstream构造函数是Microsoft扩展名。但是,通过在C ++ 17中添加标准库的文件系统,Windows C ++编译器几乎是必需的。

答案 1 :(得分:2)

您正在使用unicode进行编译,因此您必须使用wchar_t来声明字符串。而不是strcat使用的是wcscat的unicode版本。

同时更改字符串&#34; \ fichierlog.txt&#34;成为 L &#34; \ fichierlog.txt&#34;

FILE *sortie;
//char fichier[256];//   <--- HERE s my char table
wchar_t fichier[256];//   <--- HERE s my char table

//on masque 
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

int i, lettre, result, lastresult, lastletter, compteur;

GetCurrentDirectory(256, fichier);
//strcat(fichier, "\\fichierlog.txt");
wcscat(fichier, L"\\fichierlog.txt");

答案 2 :(得分:1)

您的Visual Studio项目设置为使用&#34; widechars&#34;进行编译。作为默认编码(也称为UNICODE),因此在处理字符串时,所有Windows API都会使用char数组而不是GetCurrentDirectory数组。

将项目设置为使用标准字符集,或者使用GetCurrentDirectoryA来指定GetCurrentDirectory的ASCII版本。

GetCurrentDirectoryA实际上不是一个函数,而是一个预处理器宏,它会将您引导到GetCurrentDirectoryWNSURL *URL = [NSURL URLWithString:@"http://maps.googleapis.com/maps/api/directions/xml?origin=Toronto&destination=Montreal&sensor=false"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; operation.responseSerializer = [AFXMLDictionaryResponseSerializer serializer]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSDictionary *d0 = [NSDictionary dictionaryWithXMLParser:(NSXMLParser*)responseObject]; NSLog(@"d0:%@", d0); } failure:nil]; [operation start]; ,具体取决于您的编译器设置使用的内容。