我正在使用期望Callback
的JNA界面。我有本地函數的原始地址g
,這是我想要作爲回調安裝的函數。我正在調用原生函數f
,它需要回調,並且我希望JNA通過將g
的地址傳遞給f
來將我的原始指針編組爲g
作爲回調。這對JNA來說可能嗎?傳遞JNA定義期望回調的原始函數指針?
圖表
這裏是我的意思是一個具體的例子。我正在使用Win32,我想註冊一個窗口類,其默認窗口過程爲DefWindowProc
。在普通的過程中,我會做以下用C登記具有默認的窗口過程窗口類:
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
...
wcex.lpfnWndProc = LoadLibrary("user32", "DefWindowProcA");
...
ATOM atom = RegisterClassEx(&wcex);
但是,有時我想用不同的窗口過程來註冊窗口類。在C,我會做以上完全除了:
wcex.lpfnWndProc = MyWindowProc; // Address of my custom window procedure
希望現在清楚JNA中的困難是什麼。我寫類似於Java代碼:
WNDCLASSEX wcex = new WNDCLASSEX.ByReference();
wcex.cbSize = WNDCLASSEX.size();
...
wcex.lpfnWndProc = new MyWindowProc(); // where MyWindowProc implements the Callback interface;
// but what if I want to just set it to the address of
// DefWindowProcA?
ATOM atom = User32.RegisterClassEx(wcex);
CAVEAT
我知道我可以定義的Java功能f
兩個備選版本,其中一個需要的Callback
和一個這需要Pointer
,並將我的地址傳遞給g
至Pointer
版本。我也知道我可以爲DefWindowProcA創建一個「包裝器回調」。由於各種原因,這些解決方案不夠。
寫一個適配器。編寫一個調用你的函數指針的回調實現。 –
@David請一直讀到底部的問題。 OP已經表示他們不認爲「包裝回調」方法是可以的。此外,這也是我答案的最初迭代的解決方案,OP明確表示他們想要不同的東西。 –
@Chris我可以讀。只是需要按我說的方式完成。我看不到一個原始指針如何成爲'Callback'。 –