2017-05-02 23 views
1

私はユニコードLPCWSTR種類と仕事にしようとしているとき、私はどこにでも互換性のないポインタ型を受け付けております。(C)互換性のないポインタ型[LPCWSTR]

私は何をしても完全に立ち往生していますが、何度も何度も答えを求めようとしましたが、まだ希望はありません!

マイコード:

#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; 

} 

私のビルドログ画像リンク:

warnings

PS:私はCで初心者(まだ学ん)と私がやっているかについて理解しやすい記述的な情報です間違っているといいですね。

PS2:混乱を避けるためこれは純粋なCであり、C++ではありません

ソリューションコード:

#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

しかし、これは警告です。 – arrowd

+0

私は、LPCWSTR変換に使用されるTEXTの代わりにLと_Lを試しましたが、それでもなお希望はありません。 – Supremer4331

+0

これらの警告は私のアプリケーションをクラッシュさせ、main_WindowClassが登録されないようにします。 ANSIを使用している場合は問題はありませんが、UNICODEが必要です。 – Supremer4331

答えて

2

プロジェクトでUNICODEを定義します。

UNICODEが定義されているかどうかに基づいて、TEXTLPSTRまたはLPWSTRのいずれかに展開されます。 WinAPI関数の*Wバージョンを明示的に呼び出していますが、LPWSTRの代わりにLPSTRを渡します。 Lの文字列リテラルの接頭辞は実際に動作するはずです。多分あなたはL("foo")としてそれを使用しました - それはこのように動作しません。 L"foo"を使用する必要があります。

TEXTを使用する場合は、接尾辞なしのWinAPI関数を使用する必要があります。UNICODEが定義されている場合とない場合の両方でコードがコンパイルされます。 *W関数を明示的に使用する場合は、L""文字列を使用してください。これは動作するはず

+0

ありがとうございます!私はこのために年齢を検索してきました。 – Supremer4331

+0

私は最終段落に同意しません。 'UNICODE'が定義されていないとコードが構築されないように、' TEXT'ではなく 'L'定数の文字列を使う方が良いでしょう。第1の理由は、常に「UNICODE」を定義しておかなければならないということです。第2の理由は、どちらかのモードでコンパイルするコードがバグである傾向があることです。 (そして、とにかく努力する価値はほとんどありません) –

+0

@HarryJohnston「TEXT」を「L」よりも好むべきではありませんでした。私は、「TEXT」は接尾辞なしの関数になり、「L」は行くと言っています'* W'関数を使用します。私は2017年にはANSIバージョンをまったく使用すべきではないことに同意します。あなたがレガシーコードで作業している場合にのみ、 'TEXT'と' _T'が必要です。 – Paul

0

#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

* "これはうまくいくはずです:" <壁のコード> "*答えのタイプは役に立たない。説明せずに、問題が何であり、どのように変化がそれに対処するのか、この答えは正確には価値がありません。 – IInspectable

+0

申し訳ありません、私は新しいstackoverflowだ、私は時間があるときに私の答えを改善しようとします。 – devnull

+0

新しいことは問題ではありません。あなたが提供された(ツアーを取るためにスキップすることによって)アドバイスを取ることを無視して、新しいことは、一方で、です。 – IInspectable

1

あなたはこの作業を取得するために取ることができるいくつかの方法があります。すでにGeneric-Text Mappings in Tchar.hを使用しているので、そのルートで続けましょう。

ここでは、プロジェクトがUnicodeを構築するように設定されているときにUnicodeとして動作するように改訂された、プログラムの本体です。 (あなたがプロジェクトの文字セットを変更することにより、全く同じようにASCIIのアプリケーションとしてアプリケーションを実行できるということである、ということを呼び出すかどう側「利益」、。)

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; 

} 

ユニコード固有の関数呼び出しが、DefWindowProcW()がDefWindowProc()になりました。RegisterClassExW()がRegisterClassEx(); printf()が_tprintf()などになりました。すべてのテキストはTEXT()マクロにラップされています。

別のアプローチでは、すべてのAPI呼び出しで、Unicode関数の場合は...Wバージョンを、Unicodeテキストを使用する場合はL接頭辞を使用してテキストをハードコードします。

大まかには、1つの手法を選択して、それを一貫してボード全体に適用することです。

関連する問題