首页 文章

2 IntelliSense:“const char *”类型的参数与“LPCWSTR”类型的参数不兼容

提问于
浏览
0

Stackflow成员----我是c WINAPI的初学者---当我在我的第一个WIN32 GUI中编码时,出现了一些错误[输出] ---是否有任何推荐的书籍要在C中提前---我的代码:

#include <windows.h>
const char g_szClassName[] = ("myWindowClass");
 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { 
   switch(msg)    {    
   case WM_CLOSE:     
   DestroyWindow(hwnd);    
   break;     
   case WM_DESTROY:  
   PostQuitMessage(0);  
   break;     
   default:    
   return DefWindowProc(hwnd, msg, wParam, lParam);  
   }  
   return 0; 
   }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  LPSTR lpCmdLine, int nCmdShow) {  
  WNDCLASSEX wc;   
  HWND hwnd;  
  MSG Msg;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;  
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;  
    wc.cbWndExtra    = 0;  
    wc.hInstance     = hInstance;  
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);   
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);  
    wc.lpszMenuName  = NULL;  
    wc.lpszClassName = (g_szClassName);  
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    if(!RegisterClassEx(&wc))    {  
    MessageBox(NULL,
        L"Window Registration Failed!",
    L"Error!",     
    MB_ICONEXCLAMATION | MB_OK);  
    return 0;  
    }
    // Creating the Window   
    hwnd = CreateWindowEx(    
    WS_EX_CLIENTEDGE,   
    (g_szClassName),     
    L"The title of my window",      
    WS_OVERLAPPEDWINDOW,      
    CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,        NULL, NULL, hInstance, NULL);
    if(hwnd == NULL)    {  
    MessageBox(NULL, 
        L"Window Creation Failed!",
        L"Error!",    
    MB_ICONEXCLAMATION | MB_OK);     
    return 0;  
    }
    ShowWindow(hwnd, nCmdShow);  
    UpdateWindow(hwnd);
    // Step 3: The Message Loop    
    while(GetMessage(&Msg, NULL, 0, 0) > 0)    {     
    TranslateMessage(&Msg);       
    DispatchMessage(&Msg); 
    }  
    return Msg.wParam; 
    }

输出:

3   IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR"  c:\Users\Youssef\Documents\Visual Studio 2012\Projects\Win32Project2\Win32Project2\Win32Project2.cpp    46  2   Win32Project2
    2   IntelliSense: a value of type "const char *" cannot be assigned to an entity of type "LPCWSTR"  c:\Users\Youssef\Documents\Visual Studio 2012\Projects\Win32Project2\Win32Project2\Win32Project2.cpp    34  19  Win32Project2
Error   1   error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?   c:\users\youssef\documents\visual studio 2012\projects\win32project2\win32project2\win32project2.cpp    65  1   Win32Project2

1 回答

  • 1

    您遇到的编译问题与字符串类型和Windows程序有关 .

    请注意,Windows程序有两个字符集"build types" . 第一个是 MBCS ,第二个是 Unicode . 默认情况下(假设您使用的是Visual Studio),构建类型为 Unicode ,这意味着各种Windows API函数将处理宽字符串,而不是基于 charchar 的字符串 .

    解决问题的最简单方法是使用 TCHAR 表示字符数组,使用 _T() 宏表示要从Windows API函数发送和接收的字符串文字 . 这将确保您的应用程序将编译为Unicode以及MBCS(尽管MBCS程序现在在当今时代已被淘汰) .

    这一行:

    wc.lpszClassName = (g_szClassName);
    

    由于您正在编译Unicode应用程序,并且 WNDCLASSEX 的此成员采用 LPCTSTR (指向 TCHAR 的指针),而不是 const char * ,因此会出现问题 .

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms633577%28v=vs.85%29.aspx

    所以对于这个问题,

    const char g_szClassName[] = ("myWindowClass");
    

    改变应该是:

    #include <tchar.h> // in case it isn't included 
    //...
    TCHAR g_szClassName[] = _T("myWindowClass");
    

相关问题