のNO.85494より「2. モジュール空間内でラベルをコールバックさせる。」
こちらの内容を元にラベルのジャンプ先で一時的にモジュール型変数のモジュール変数(紛らわしさ回避のため以下、メンバ変数)を取得できることを知ったのですが、
どうやらgosubでのジャンプ先では取得可能なもののコールバックによるジャンプの場合取得ができないようです。
#include "user32.as" #include "modclbk3.hsp" #define global NULLPTR 0x00000000 #define global NULL 0x00000000 #define global WS_OVERLAPPEDWINDOW 0x00CF0000 #define global SW_SHOWNORMAL 0x00000001 #define global GWL_WNDPROC 0xFFFFFFFC #define global WM_CLOSE 0x00000010 #define global WM_LBUTTONDOWN 0x00000201 #module test_module a #modinit a = 100 newclbk3 hWindowProc, 4, *clbkWindowProc if (hWindowProc == nullptr) : dialog "create callback failed" : end winobj "hspwnd0", "test window", NULL, WS_OVERLAPPEDWINDOW, 640, 480, NULL, NULL if (stat == -1) : dialog "create window failed" : end hTestWindow = objinfo_hwnd(stat) SetWindowLong hTestWindow, GWL_WNDPROC, hWindowProc //プロシージャ変更 if (stat == 0) : dialog "change WndProc failed" : end ShowWindow hTestWindow, SW_SHOWNORMAL gosub *testlabel return 1 #modcfunc getA //aのgetter関数 return a *testlabel logmes "a is " + a + "" //これは成功する return *clbkWindowProc clbkargprotect msg if (msg.1 == WM_CLOSE) : PostMessage hwnd, WM_CLOSE, msg.2, msg.3 // if (msg.1 == WM_LBUTTONDOWN) : logmes "a is " + getA(thismod) + "" // こっちも無理 (非コメントアウトで確認) if (msg.1 == WM_LBUTTONDOWN) : logmes "a is " + a@test_module + "" // これはエラー30「無効な名前が〜」が発生 return DefWindowProc(msg.0, msg.1, msg.2, msg.3) // クラス「hspwnd0」側のプロシージャを呼ぶとエラーダイアログが表示されなくなる #global newmod hoge, test_module
この例ですと*testlabel内(gosub)だとメンバ変数 aの内容を取得できますが*clbkWindowProc(コールバック)だと取得不可です。thismodによるgetter関数での取得も無理でした。
(恐らくmodclbk3がgosubによるジャンプをしていないためにgosubのジャンプと処理が違ってアクセスができない?)
コールバック先からモジュール型変数のメンバ変数を取得することはできないのでしょうか。