我成功地将自己的
Java代码注入到运行的Oracle Forms应用程序中,使用DLL注入和一些jni欺骗. (Windows 7,32位,Oracle Forms 11,JRE Java 8)
我可以遍历组件树,并查询和设置一些基本Java对象中的值,例如来自class oracle.forms.ui.VTextField的值
当我试图模拟用户点击oracle.apps.fnd.ui.Button时,我被卡住了
我试过2件事情:
>调用AbstractButton类的simulatePush方法
>调用PushButton类的activate方法
(2类在Button的类层次结构中)
结果相同:
首先,它工作正常:当按钮是“搜索”按钮时,搜索完成并显示结果.
然后,它立即中断应用程序,弹出一声说FRM-92100您与服务器的连接中断.
从那里,应用程序被挂起.
更新:
似乎导致与服务器断开连接的错误是:
java.lang.SecurityException: this KeyboardFocusManager is not
installed in the current thread’s context at
java.awt.KeyboardFocusManager.checkCurrentKFMSecurity(Unknown Source)
at java.awt.KeyboardFocusManager.getGlobalFocusOwner(Unknown Source)
at
java.awt.KeyboardFocusManager.processSynchronousLightweightTransfer(Unknown
Source) at
sun.awt.windows.WComponentPeer.processSynchronousLightweightTransfer(Native
Method) at sun.awt.windows.WComponentPeer.requestFocus(Unknown
Source) at java.awt.Component.requestFocusHelper(Unknown Source) at
java.awt.Component.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(Unknown Source) at
oracle.forms.handler.UICommon.onUpdate(Unknown Source) at
oracle.forms.handler.ComponentItem.onUpdate(Unknown Source) at
oracle.forms.handler.JavaContainer.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 Source) 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(Unknown Source) at
oracle.ewt.lwAWT.LWComponent.processEvent(Unknown Source) at
oracle.ewt.button.PushButton.activate(Unknown Source) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
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(Unknown Source) at
java.awt.EventQueue$2.run(Unknown Source) at
java.security.AccessController.doPrivileged(Native Method) at
java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown
Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at
java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown
Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at
java.awt.EventDispatchThread.run(Unknown Source)
我的代码在这里: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,alive,daemon
Timer-0,alive
Java Plug-In Pipe Worker Thread (Client-Side),daemon
AWT-Shutdown,alive
AWT-Windows,6,daemon
AWT-EventQueue-0,alive
SysExecutionTheadCreator,daemon
CacheMemoryCleanUpThread,daemon
CacheCleanUpThread,daemon
Browser Side Object Cleanup Thread,alive
JVM[id=0]-Heartbeat,daemon
Windows Tray Icon Thread,alive
Thread-13,alive
Group Plugin Thread Group,ac=3,agc=0,pri=10
AWT-EventQueue-1,alive
TimerQueue,daemon
ConsoleWriterThread,daemon
Group http://xxxx.xxxx.xxxxx.xx:8001/OA_JAVA/-threadGroup,ac=13,pri=4
Applet 1 LiveConnect Worker Thread,4,alive
AWT-EventQueue-2,alive
thread applet-oracle/apps/fnd/formsClient/FormsLauncher.class-1,alive
Applet 2 LiveConnect Worker Thread,alive
thread applet-oracle.forms.engine.Main-2,alive
Forms-StreamMessageReader,alive
Forms-StreamMessageWriter,alive
HeartBeat,alive
Busy indicator,1,daemon
TaskScheduler timer,alive
CursorIdler,alive
Thread-14,alive
Flush Queue,alive
Done.
所以,有三个AWT-EventQueue线程…问题现在:如何查询/检索正确的一个,以及如何使Runnable传递给invokeLater运行在“好线程”(我猜,好的是最后一个(AWT-EventQueue-2)