2017-05-02 3 views
1

Ich erhalte inkompatiblen Zeigertyp überall wenn ich Arbeit mit Unicode versuchen LPCWSTR Typen.(C) Inkompatible Zeigertyp [LPCWSTR]

Ich bin völlig fest, egal was ich tue, versuchte, eine Antwort viele Male und immer noch keine Hoffnung zu suchen!

Mein Code:

#include <tchar.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include "Mouse.h" 
#include "Keyboard.h" 
//#define APP_WindowClassName "MOUSE_CLICKER" 
//#define APP_WindowTitle "Mouse Clicker" 

LRESULT CALLBACK app_WindowProcedure (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     default: 
      return DefWindowProcW(hwnd, uMsg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Arg1 - A handle to the current instance of the application, Arg 2 - ???, Arg 3 - Arguments, Arg 4 - Controls how the window is to be shown. 

    WNDCLASSEXW main_WindowClass = { }; 
    main_WindowClass.cbSize = sizeof(WNDCLASSEXA); 
    main_WindowClass.cbClsExtra = 0; 
    main_WindowClass.cbWndExtra = 0; 
    main_WindowClass.hInstance = hInstance; 
    main_WindowClass.lpfnWndProc = app_WindowProcedure; 
    main_WindowClass.lpszClassName = TEXT("MOUSE_CLICKER"); 
    main_WindowClass.lpszMenuName = NULL; 
    main_WindowClass.hbrBackground = (HBRUSH) (TEXT(COLOR_BACKGROUND)); 
    main_WindowClass.hCursor = LoadCursorW (NULL, TEXT(IDC_ARROW)); 
    main_WindowClass.hIcon = LoadIconW(NULL, TEXT(IDI_APPLICATION)); 
    main_WindowClass.hIconSm = LoadIconW(NULL, TEXT(IDI_APPLICATION)); 
    main_WindowClass.style = CS_DBLCLKS; 

    //CS_HREDRAW | CS_VREDRAW a 


    if (RegisterClassExW(&main_WindowClass) == 0) { 
     printf ("[CRITICAL] main_WindowClass cannot be registered!"); 
     return -1; 
    } 

    HWND main_WindowHandle = CreateWindowExW (0, TEXT("MOUSE_CLICKER"), TEXT("MouseClicker"), WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); 

    if (main_WindowHandle == NULL) { 
     return -1; 
    } 

    ShowWindow(main_WindowHandle, nCmdShow); 

    printf("Unicode: %d", IsWindowUnicode(main_WindowHandle)); 

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

} 

Mein build log Bildlink:

warnings

PS: Ich bin ein Anfänger in C (noch lernen) und verständlich beschreibende Informationen darüber, was ich tue, falsch wäre nett.

PS2: Um Verwechslungen zu vermeiden ist dies reines C, NICHT C++.

Lösungscode:

#if defined(UNICODE) && !defined(_UNICODE) 
    #define _UNICODE 
#elif defined(_UNICODE) && !defined(UNICODE) 
    #define UNICODE 
#endif 

#include <tchar.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <tchar.h> 
#include "Mouse.h" 
#include "Keyboard.h" 

LRESULT CALLBACK app_WindowProcedure (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     default: 
      return DefWindowProcW(hwnd, uMsg, wParam, lParam); 

    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Arg1 - A handle to the current instance of the application, Arg 2 - ???, Arg 3 - Arguments, Arg 4 - Controls how the window is to be shown. 

    WNDCLASSEXW main_WindowClass = { }; 
    main_WindowClass.cbSize = sizeof(WNDCLASSEXA); 
    main_WindowClass.cbClsExtra = 0; 
    main_WindowClass.cbWndExtra = 0; 
    main_WindowClass.hInstance = hInstance; 
    main_WindowClass.lpfnWndProc = app_WindowProcedure; 
    main_WindowClass.lpszClassName = L"MOUSE_CLICKER"; 
    main_WindowClass.lpszMenuName = NULL; 
    main_WindowClass.hbrBackground = (HBRUSH) (COLOR_BACKGROUND); 
    main_WindowClass.hCursor = LoadCursorW (NULL, (LPCWSTR) IDC_ARROW); 
    main_WindowClass.hIcon = LoadIconW(NULL, (LPCWSTR) IDI_APPLICATION); 
    main_WindowClass.hIconSm = LoadIconW(NULL, (LPCWSTR) IDI_APPLICATION); 
    main_WindowClass.style = CS_DBLCLKS; 

    //CS_HREDRAW | CS_VREDRAW a 


    if (RegisterClassExW(&main_WindowClass) == 0) { 
     printf ("[CRITICAL] main_WindowClass cannot be registered!"); 
     return -1; 
    } 

    HWND main_WindowHandle = CreateWindowExW (0, L"MOUSE_CLICKER", L"MouseClicker", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); 

    if (main_WindowHandle == NULL) { 
     return -1; 
    } 

    ShowWindow(main_WindowHandle, nCmdShow); 

    printf("Unicode: %d", IsWindowUnicode(main_WindowHandle)); 

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

} 
+0

Aber das sind Warnungen. – arrowd

+0

Ich habe versucht L und _L anstelle von TEXT, die für LPCWSTR Konvertierung verwendet wird, immer noch keine Hoffnung. – Supremer4331

+0

Diese Warnungen stürzt meine App ab, macht Main_WindowClass nicht registriert werden. Wenn ANSI verwendet wird, habe ich keine Probleme, aber ich möchte UNICODE. – Supremer4331

Antwort

2

definieren UNICODE in Ihrem Projekt.

Je nachdem, ob UNICODE definiert ist, wird TEXT entweder auf LPSTR oder LPWSTR erweitert. Sie rufen explizit *W Versionen von WinAPI-Funktionen auf, aber übergeben LPSTR statt LPWSTR. Das Präfix-String-Literal mit L sollte eigentlich funktionieren. Vielleicht hast du es als L("foo") verwendet - es wird nicht so funktionieren. Sie müssen L"foo" verwenden. Wenn Sie TEXT verwenden, sollten Sie WinAPI-Funktionen ohne Suffixe verwenden, damit der Code mit und ohne UNICODE definiert wird. Wenn Sie explizit *W Funktionen verwenden, verwenden Sie L"" Strings.

+0

Vielen Dank! Ich habe schon ewig danach gesucht. – Supremer4331

+0

Ich stimme nicht mit Ihrem letzten Absatz überein; Es ist besser, "L" konstante Strings anstelle von "TEXT" zu verwenden, damit der Code nicht erstellt wird, wenn "UNICODE" nicht definiert ist. Der erste Grund ist, dass Sie * immer * UNICODE definiert haben sollten, und der zweite Grund ist, dass Code, der in beiden Modi kompiliert wird, eher fehlerhaft ist, weil er normalerweise nur in einem oder dem anderen Modus getestet wird. (Und es ist fast nie die Mühe wert.) –

+0

@HarryJohnston Ich meinte nicht, dass man lieber 'TEXT' über' L' verwenden sollte, ich sagte nur, 'TEXT' geht mit Funktionen ohne Suffixe und' L' geht mit '* W' Funktionen. Ich stimme zu, dass Sie 2017 keine ANSI-Versionen verwenden sollten, da Sie TEXT und _T nur dann benötigen, wenn Sie an altem Code arbeiten. – Paul

0

Diese Arbeit sollte

#include <tchar.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include "Mouse.h" 
#include "Keyboard.h" 
//#define APP_WindowClassName "MOUSE_CLICKER" 
//#define APP_WindowTitle "Mouse Clicker" 

LRESULT CALLBACK app_WindowProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProcW(hwnd, uMsg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Arg1 - A handle to the current instance of the application, Arg 2 - ???, Arg 3 - Arguments, Arg 4 - Controls how the window is to be shown. 

    WNDCLASSEXW main_WindowClass = *((WNDCLASSEXW*)malloc(sizeof(WNDCLASSEXW))); 
    main_WindowClass.cbSize = sizeof(WNDCLASSEXA); 
    main_WindowClass.cbClsExtra = 0; 
    main_WindowClass.cbWndExtra = 0; 
    main_WindowClass.hInstance = hInstance; 
    main_WindowClass.lpfnWndProc = app_WindowProcedure; 
    main_WindowClass.lpszClassName = L"MOUSE_CLICKER"; 
    main_WindowClass.lpszMenuName = NULL; 
    main_WindowClass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); 
    main_WindowClass.hCursor = LoadCursorW(NULL, (LPWSTR)IDC_ARROW); 
    main_WindowClass.hIcon = LoadIconW(NULL, (LPWSTR)IDI_APPLICATION); 
    main_WindowClass.hIconSm = LoadIconW(NULL, (LPWSTR)IDI_APPLICATION); 
    main_WindowClass.style = CS_DBLCLKS; 

    //CS_HREDRAW | CS_VREDRAW a 


    if (RegisterClassExW(&main_WindowClass) == 0) { 
     printf("[CRITICAL] main_WindowClass cannot be registered!"); 
     return -1; 
    } 

    HWND main_WindowHandle = CreateWindowExW(0, L"MOUSE_CLICKER", L"MouseClicker", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); 

    if (main_WindowHandle == NULL) { 
     return -1; 
    } 

    ShowWindow(main_WindowHandle, nCmdShow); 

    printf("Unicode: %d", IsWindowUnicode(main_WindowHandle)); 

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

} 
+0

* "Das sollte funktionieren: " * Art der Antworten sind nicht sinnvoll. Ohne zu erklären, was das Problem ist und wie die Änderungen das ansprechen, ist diese Antwort nicht gerade wertvoll. – IInspectable

+0

Sorry, ich bin neu bei stackoverflow, ich werde versuchen, meine Antwort zu verbessern, wenn ich Zeit habe. – devnull

+0

Neu sein ist kein Problem. Neu zu sein und zu ignorieren, um den Rat anzunehmen (indem man auf die [Tour] springt, die man angeboten hat), ist andererseits. – IInspectable

1

Es gibt mehrere Ansätze, die Sie diese bekommen ergreifen können, um zu arbeiten; Da Sie bereits den Weg der Verwendung von Generic-Text Mappings in Tchar.h gehen, gehen wir auf dieser Route weiter.

Hier ist der Hauptteil Ihres Programms, überarbeitet, um als Unicode ausgeführt zu werden, wenn Ihr Projekt Unicode erstellen soll.

(A-Seite „Nutzen“, wenn man es so nennen würde, dass, ist, dass Sie können Ihre Anwendung als ASCII-Anwendung ausgeführt und nur durch den Zeichensatz des Projektes zu ändern.)

LRESULT CALLBACK app_WindowProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // Arg1 - A handle to the current instance of the application, Arg 2 - ???, Arg 3 - Arguments, Arg 4 - Controls how the window is to be shown. 

    WNDCLASSEX main_WindowClass = {}; 
    main_WindowClass.cbSize = sizeof(WNDCLASSEX); 
    main_WindowClass.cbClsExtra = 0; 
    main_WindowClass.cbWndExtra = 0; 
    main_WindowClass.hInstance = hInstance; 
    main_WindowClass.lpfnWndProc = app_WindowProcedure; 
    main_WindowClass.lpszClassName = TEXT("MOUSE_CLICKER"); 
    main_WindowClass.lpszMenuName = NULL; 
    main_WindowClass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); 
    main_WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    main_WindowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    main_WindowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 
    main_WindowClass.style = CS_DBLCLKS; 

    //CS_HREDRAW | CS_VREDRAW a 


    if (RegisterClassEx(&main_WindowClass) == 0) { 
     _tprintf(TEXT("[CRITICAL] main_WindowClass cannot be registered!")); 
     return -1; 
    } 

    HWND main_WindowHandle = CreateWindowEx(0, TEXT("MOUSE_CLICKER"), TEXT("MouseClicker"), WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); 

    if (main_WindowHandle == NULL) { 
     return -1; 
    } 

    ShowWindow(main_WindowHandle, nCmdShow); 

    _tprintf(TEXT("Unicode: %d"), IsWindowUnicode(main_WindowHandle)); 

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

} 

Beachten Sie, dass Unicode-spezifische Funktionsaufrufe mit ihren generischen Pendants ersetzt wurden (zB DefWindowProcW() ist jetzt DefWindowProc(); RegisterClassExW() ist jetzt RegisterClassEx(); printf() ist jetzt _tprintf(), und so weiter). Der gesamte Text ist in das Makro TEXT() eingeschlossen.Ein alternativer Ansatz, wie Sie teilweise gearbeitet haben, besteht darin, alle API-Aufrufe die ...W-Versionen für Unicode-Funktionen zu machen und Text mit dem Präfix L für die Verwendung von Unicode-Text hart zu codieren.

Eine gute Faustregel ist zu versuchen, die eine oder andere Technik auszuwählen und sie konsequent und auf der ganzen Linie anzuwenden.