2011-01-16 7 views
0

Ich habe diese einfache Windows-Anwendung erstellt:'wsprintfW': kann nicht Parameters 1 von 'char [80]' konvertieren 'LPWSTR'

#include <windows.h> 
#include <stdio.h> 


LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        PSTR szCmdLine, int iCmdShow) 
{ 
    int idmes = MessageBox (NULL, TEXT ("Hello!"), TEXT ("HelloMsg"), MB_ABORTRETRYIGNORE) ; 

    static TCHAR szAppName[] = TEXT ("HelloWin") ; 
    HWND   hwnd ; 
    MSG   msg ; 
    WNDCLASS  wndclass ; 

    wndclass.style   = CS_HREDRAW | CS_VREDRAW ; 
    wndclass.lpfnWndProc = WndProc ; 
    wndclass.cbClsExtra = 0 ; 
    wndclass.cbWndExtra = 0 ; 
    wndclass.hInstance  = hInstance ; 
    wndclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION) ; 
    wndclass.hCursor  = LoadCursor (NULL, IDC_ARROW) ; 
    wndclass.hbrBackground = (HBRUSH) (COLOR_BACKGROUND+11) ; 
    wndclass.lpszMenuName = NULL ; 
    wndclass.lpszClassName = szAppName ; 

    if (!RegisterClass (&wndclass)) 
    { 
      MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
         szAppName, MB_ICONERROR) ; 
      return 0 ; 
    } 

    hwnd = CreateWindow (szAppName,     // window class name 
          TEXT ("Programma di emiliano"), // window caption 
          WS_OVERLAPPEDWINDOW,  // window style 
          CW_USEDEFAULT,    // initial x position 
          CW_USEDEFAULT,    // initial y position 
          CW_USEDEFAULT,    // initial x size 
          CW_USEDEFAULT,    // initial y size 
          NULL,      // parent window handle 
          NULL,      // window menu handle 
          hInstance,     // program instance handle 
          NULL) ;      // creation parameters 

    ShowWindow (hwnd, iCmdShow) ; 
    UpdateWindow (hwnd) ; 

    while (GetMessage (&msg, NULL, 0, 0)) 
    { 
      TranslateMessage (&msg) ; 
      DispatchMessage (&msg) ; 
    } 
    return msg.wParam ; 
} 




LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    HDC   hdc ; 
    PAINTSTRUCT ps ; 
    RECT  rect ; 
    static short xChar, yChar ; 
    TEXTMETRIC tm ; 
    char   szBuffer[80]; 
    int   i ; 


    switch (message) 
    { 
    case WM_CREATE: 
      MessageBox (NULL, TEXT ("Ciao caro!"), TEXT ("Salve bellezza"), 0) ; 
      hdc = GetDC (hwnd) ; 
      GetTextMetrics (hdc, &tm) ; 
      xChar = tm.tmAveCharWidth ; 
      yChar = tm.tmHeight + tm.tmExternalLeading ; 
      ReleaseDC (hwnd, hdc) ; 
      return 0 ; 

    case WM_PAINT: 
      hdc = BeginPaint (hwnd, &ps) ; 
     int iLength; 

      for (i = 0 ; i < 10 ; i++) 
      { iLength = wsprintf(szBuffer, "The number is %d.", i); 
       TextOut (ps.hdc, xChar, yChar * (1 + i), szBuffer, 5) ; 
      } 
      EndPaint (hwnd, &ps) ; 
      return 0 ; 

    case WM_DESTROY: 
      PostQuitMessage (0) ; 
      return 0 ; 
    } 
    return DefWindowProc (hwnd, message, wParam, lParam) ; 
} 

aber ich bekomme diese Fehlermeldung:

------ Build started: Project: primo, Configuration: Debug Win32 ------ 
Build started 16/01/2011 03:10:02. 
InitializeBuildStatus: 
    Creating "Debug\primo.unsuccessfulbuild" because "AlwaysCreate" was specified. 
ClCompile: 
    All outputs are up-to-date. 
    primo.cpp 
c:\users\larry\documents\visual studio 2010\projects\primo\primo\primo.cpp(79): warning C4244: '=' : conversion from 'LONG' to 'short', possible loss of data 
c:\users\larry\documents\visual studio 2010\projects\primo\primo\primo.cpp(80): warning C4244: '=' : conversion from 'LONG' to 'short', possible loss of data 
c:\users\larry\documents\visual studio 2010\projects\primo\primo\primo.cpp(90): error C2664: 'wsprintfW' : cannot convert parameter 1 from 'char [80]' to 'LPWSTR' 
      Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

Build FAILED. 

Time Elapsed 00:00:02.34 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Warum?

Antwort

4

Ändern Sie den Code wie folgt:

TCHAR szBuffer[80]; 
... 
iLength = wsprintf(szBuffer, TEXT ("The number is %d."), i); 
+1

Eigentlich ist das falsch.' wsprintf' ist immer Unicode. 'TEXT' ist abhängig von den Kompilierungseinstellungen. –

+1

@Remus: nicht wahr. wsprintf wird entweder für ANSI kompilieren (wsprintfA) oder Unicode (wsprintfW). Aber ich hätte die Zeichenfolge als TCHAR anstelle von WCHAR deklariert werden. Fixed. – cbranch

+0

Ich bin verdammt, du hast Recht. Es dauert 'LPTSTR' /' LPCTSTR' nicht 'LPWSTR' /' LPCWSTR '. –

1

Zunächst sollten Sie die Menge an Code, die Sie veröffentlichen, auf den Betrag begrenzen, der beim Posten von Fragen nicht funktioniert. Ein großer Teil dessen, was Sie gepostet haben, ist für das Problem überflüssig.

Zweitens, die Antwort auf Ihr Problem ist, müssen Sie das Präfix 'L' für breite Zeichenfolgen verwenden, die wsprintf erwartet (henses the w). Also, "The number is %d." sollte stattdessen L"The number is %d." lesen. Das wird dein aktuelles Problem beheben.

+0

Ich habe gerade das 'L' Präfix hinzugefügt, aber ich bekomme das gleiche Problem :( – xRobot

+0

iLength = wsprintf (szBuffer, L "Die Nummer ist% d.", I), richtig? – xRobot

+0

Ja, das stimmt ... aber beachte deine anderen Antworten. "szBuffer ist auch der falsche Typ. –

3

mit ANSI/Unicode-Strings übereinstimmen. Sie verwenden TEXT und TCHAR an den meisten Stellen, aber Sie mischen dann hart codierten Unicode wsprintf und hart codierten ANSI char szBuffer[80];. Ich könnte Ihnen sagen, dass Sie einfach die Deklaration zu WCHAR szBuffer[80]; ändern können, aber das ist nicht wahr.

In erster Linie müssen Sie richtig sein. Zweitens müssen Sie konsistent sein.

Für die Korrektheit: wsprintf nimmt Unicode-Strings als erste zwei Argumente. Kein Aber, kein Wenn. Sie übergeben zwei ANSI-Zeichenfolgen, daher der Compiler-Fehler:

Aber Sie müssen auch konsistent sein. Wenn Sie TEXT und TCHAR verwenden, bleiben Sie bei Geschmack von Strings und Funktionen überall. Wenn Sie die _T (was Sie sollten, gibt es keinen Grund, ANSI-Code in den heutigen Tagen kompilieren), dann entfernen Sie es überall.

1

Ich hatte das gleiche Problem. Den obigen Antworten fehlt die Tatsache, dass der Fehler auf dem ersten Parameter steht: szbuffer, und nicht auf der String-Konstante "Die Zahl ist% id", was der zweite Parameter ist.

löste ich das Problem, indem einfach als den ersten Parameter Gießen:

(LPWSTR)szbuffer 

er den Fehler hielt der Compiler mir gab.

Verwandte Themen