質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2127閲覧

SetWindowLongPtrで,コンパイルエラーになる

退会済みユーザー

退会済みユーザー

総合スコア0

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/01/17 09:13

このサイトを参考に,ウィンドウプロシージャのすり替えをしようとしましたが,掲載されているソースコード(のGWL_WNDPROCをGWLP_WNDPROCに変えた)をコンパイルしようとすると,

test.cpp:34:48: error: cast from 'LRESULT (*)(HWND, UINT, WPARAM, LPARAM)' {aka 'long long int (*)(HWND__*, unsigned int, long long unsigned int, long long int)'} to 'LONG' {aka 'long int'} loses precision [-fpermissive] SetWindowLong(rect_box , GWL_WNDPROC , (LONG)StaticProc); ^~~~~~~~~~

というエラーがでてしまいます。「数値からポインタにはキャストできないよー」という趣旨のエラーであることはわかるんですが,どう試してもエラーになるので途方に暮れています。

ソースコード

C++

1#include <windows.h> 2 3WNDPROC DefStaticProc; 4 5LRESULT CALLBACK StaticProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { 6 switch(msg) { 7 case WM_NCHITTEST: 8 if (GetKeyState(VK_LBUTTON) < 0) 9 MessageBox( 10 hwnd , TEXT("Kitty on your lap") , 11 TEXT("Kitty") , MB_OK 12 ); 13 return 0; 14 } 15 return CallWindowProc(DefStaticProc , hwnd , msg , wp , lp); 16} 17 18LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { 19 static HWND rect_box; 20 21 switch (msg) { 22 case WM_DESTROY: 23 PostQuitMessage(0); 24 return 0; 25 case WM_CREATE: 26 rect_box = CreateWindow( 27 TEXT("STATIC") , TEXT("Kitty") , 28 WS_CHILD | WS_VISIBLE , 29 0 , 0 , 200 , 45 , 30 hwnd , (HMENU)1 , 31 ((LPCREATESTRUCT)(lp))->hInstance , NULL 32 ); 33 DefStaticProc = (WNDPROC)GetWindowLongPtr(rect_box , GWLP_WNDPROC); 34 SetWindowLongPtr(rect_box , GWLP_WNDPROC , (LONG)StaticProc); 35 return 0; 36 } 37 return DefWindowProc(hwnd , msg , wp , lp); 38} 39 40int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , 41 PSTR lpCmdLine , int nCmdShow ) { 42 HWND hwnd; 43 MSG msg; 44 WNDCLASS winc; 45 46 winc.style = CS_HREDRAW | CS_VREDRAW; 47 winc.lpfnWndProc = WndProc; 48 winc.cbClsExtra = winc.cbWndExtra = 0; 49 winc.hInstance = hInstance; 50 winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); 51 winc.hCursor = LoadCursor(NULL , IDC_ARROW); 52 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 53 winc.lpszMenuName = NULL; 54 winc.lpszClassName = TEXT("KITTY"); 55 56 if (!RegisterClass(&winc)) return -1; 57 58 hwnd = CreateWindow( 59 TEXT("KITTY") , TEXT("Kitty on your lap") , 60 WS_OVERLAPPEDWINDOW | WS_VISIBLE , 61 CW_USEDEFAULT , CW_USEDEFAULT , 62 CW_USEDEFAULT , CW_USEDEFAULT , 63 NULL , NULL , hInstance , NULL 64 ); 65 66 if (hwnd == NULL) return -1; 67 68 while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg); 69 return msg.wParam; 70} 71

環境

Windows8
MinGW-W64

gcc

1Using built-in specs. 2COLLECT_GCC=gcc 3COLLECT_LTO_WRAPPER=D:/Apps/MinGW-W64/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe 4Target: x86_64-w64-mingw32 5Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-pos 6ix-seh-rt_v6-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable 7-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-libstdcxx-pch --disable-libstdcxx-debug --e 8nable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --w 9ith-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64 10-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/pro 11jects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisi 12tes/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include 13 -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/in 14clude -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_6 154-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib ' 16Thread model: posix 17gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SetWindowLongPtrを使って、コールバックはLONG_PTRにキャストする。
LONGは32bitなので x64環境では64bitなポインタを表現できない、というエラーなので。

投稿2022/01/17 09:55

matukeso

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問