我成功地在正在運行的Oracle Forms應用程序中使用DLL注入和一些jni技巧注入自己的Java代碼。 (Windows 7中,32位,的Oracle Forms 11,JRE爪哇8)如何選擇AWT-EventQueue線程,其中有幾個線程
我能夠遍歷組件的樹和查詢,並且在一些基本的Java對象,如那些從類設定值oracle.forms.ui.VTextField
試圖模擬一個oracle.apps.fnd.ui.Button
用戶點擊我想兩兩件事,當我卡住:
- 通話
AbstractButton
類 的
- 呼叫的
PushButton
類
simulatePush
方法
(2類在類層次結構Button
)的activate
方法
結果是相同的: 1.首先,它正常工作:當按鈕是「搜索」按鈕,搜索完成並顯示結果。 2.然後,它立即中斷應用程序,彈出窗口說FRM-92100 Your connection to the Server was interrupted
。
從那裏,應用程序被掛起。
更新: 看來,從服務器會導致斷線的錯誤是:
java.lang.SecurityException異常:此KeyboardFocusManager不是在 的Java安裝在當前線程的上下文 。 (未知源) at java.awt.KeyboardFocusManager.processSynchronousLightweightTransfer(Unknown Source)在在 java.awt.Component中 sun.awt.windows.WComponentPeer.processSynchronousLightweightTransfer(本地 法)以sun.awt.windows.WComponentPeer.requestFocus(未知 來源)在java.awt.Component.requestFocusHelper(來源不明) .requestFocusHelper(Unknown Source)at java.awt.Component.requestFocus(Unknown Source)at oracle.forms.handler.UICommon.updateFocus(Unknown Source)at oracle.forms.handler.UICommon.setFVP(Unknown Source)at oracle.forms.handler.UICommon.setFVP(未知來源)處 oracle.forms.handler.ComponentItem.onUpdate(未知來源) oracle.forms.handler.UICommon.onUpdate(未知來源)在 oracle.forms。 handler.JavaContaine r.onUpdate(Unknown Source)at oracle.forms.handler.UICommon.onUpdate(Unknown Source)at oracle.forms.engine.Runform.onUpdateHandler(Unknown Source)at oracle.forms.engine.Runform.processMessage(Unknown來源)at oracle.forms.engine.Runform.processSet(Unknown Source)at oracle.forms.engine.Runform.onMessageReal(Unknown Source)at oracle.forms.engine.Runform.onMessage(Unknown Source)at oracle .forms.engine.Runform.processEventEnd(Unknown Source)at oracle.ewt.lwAWT.LWComponent。redispatchEvent完成(來源不明)處 oracle.ewt.lwAWT.LWComponent.processEvent(來源不明)在 oracle.ewt.button.PushButton.activate(來源不明)在 sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at CustomAWT.run(CustomAWT.java:34 )at java.awt.event.InvocationEvent.dispatch(Unknown Source)at java.awt.EventQueue.dispatchEventImpl(Unknown Source)at java.awt.EventQueue.access $ 400(Unknown Source)at java.awt.EventQueue $ 2.run(未知來源) java.awt.EventQueue中的$ 2.run(來源不明)在 java.security.AccessController.doPrivileged(本機方法)在 java.security.AccessControlContext $ 1.doIntersectionPrivilege(未知 來源)在java.awt.EventQueue.dispatchEvent(來源不明)在 java.awt.EventDispatchThread.pumpOneEventForFilters(來源不明) 在java.awt.EventDispatchThread.pumpEventsForFilter(來源不明) 在java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 來源)在java.awt.EventDispatchThread。 pumpEvents(未知來源) 處 java.awt.EventDispatchThread.run(未知來源)java.awt.EventDispatchThread.pumpEvents(未知來源)
我的代碼在這裏:CustomAWT.run(CustomAWT.java:34)
並且調用invokeLater
。問題可能是:當撥打oracle.ewt.button.PushButton.activate
方法時,我不在右邊的EDT。
在Java控制檯使用「列表線程」,我得到:
Dump thread list ...
Group main,ac=30,agc=2,pri=10
main,5,alive
traceMsgQueueThread,5,alive,daemon
Timer-0,5,alive
Java Plug-In Pipe Worker Thread (Client-Side),5,alive,daemon
AWT-Shutdown,5,alive
AWT-Windows,6,alive,daemon
AWT-EventQueue-0,6,alive
SysExecutionTheadCreator,5,alive,daemon
CacheMemoryCleanUpThread,5,alive,daemon
CacheCleanUpThread,5,alive,daemon
Browser Side Object Cleanup Thread,5,alive
JVM[id=0]-Heartbeat,5,alive,daemon
Windows Tray Icon Thread,5,alive
Thread-13,5,alive
Group Plugin Thread Group,ac=3,agc=0,pri=10
AWT-EventQueue-1,6,alive
TimerQueue,5,alive,daemon
ConsoleWriterThread,6,alive,daemon
Group http://xxxx.xxxx.xxxxx.xx:8001/OA_JAVA/-threadGroup,ac=13,agc=0,pri=4
Applet 1 LiveConnect Worker Thread,4,alive
AWT-EventQueue-2,4,alive
thread applet-oracle/apps/fnd/formsClient/FormsLauncher.class-1,4,alive
Applet 2 LiveConnect Worker Thread,4,alive
thread applet-oracle.forms.engine.Main-2,4,alive
Forms-StreamMessageReader,4,alive
Forms-StreamMessageWriter,4,alive
HeartBeat,4,alive
Busy indicator,1,alive,daemon
TaskScheduler timer,4,alive
CursorIdler,4,alive
Thread-14,4,alive
Flush Queue,4,alive
Done.
因此,有三AWT-EventQueue
線程。問題是現在:如何查詢/檢索正確的,以及如何傳遞給invokeLater
在「好線程」運行Runnable
(我猜的不錯的一個是最後一個(AWT-EventQueue-2
)
你試過'separateFrame =「True」applet參數嗎? – dan
@dan我無法更改服務器上的任何內容。不知道我明白你的建議。 Oracle Forms應用程序(Oracle應用程序電子商務中心)已經作爲Window Desktop的子窗口運行。 – manuell