我有一个小程序,其中包含第三方 dll(来自 JTwain)。我的小程序从 TWAIN 兼容的默认打印机扫描文档。小程序因卡纸而失败并且无法恢复。用户离开页面并且小程序被销毁。当返回页面时,它再次失败。关闭浏览器(这会杀死电脑上的 java.exe 进程),然后返回页面即可清除问题,一切正常。
我想重新启动一切,而不需要用户关闭浏览器。我已将 GUID 查询字符串添加到从中加载小程序资源的 URL,因此我知道没有缓存任何内容。我检查了 Windows 任务管理器,发现 dll 没有创建任何进程,这一切都发生在主 java.exe 进程中。我尝试将扫描过程包装在一个线程中,以便我可以在 stop 或 destroy 方法中中断它(以防小程序线程在小程序被销毁时没有停止),但这不起作用。
任何建议将不胜感激。理想情况下,我希望在小程序卸载时以某种方式重新启动 java(但我怀疑这是可能的)。
更新
我花了几天时间试图找出导致小程序失败的原因。我还是不知道:(
当发生卡纸时(不是我的代码),会产生几个弹出窗口。第一个警告用户卡纸,并且可以通过单击“确定”按钮关闭。第二个说“从设备读取”并挂起。它无法通过顶部角落的红色关闭窗口图标关闭 - 我从任务管理器中杀死它,并且 Windows 要求发送有关“无响应程序”的报告。我假设这些弹出窗口是由 dll 生成的。鉴于第二个挂起,我的假设是由 dll 启动的线程已挂起,同时保留了 TWAIN 应用程序某些组件的锁定。我明白了
com.asprise.util.jtwain.JTwainException: Failed to open the specified data source:
Source: TW-Brother MFC-9970CDW LAN Thrown
..当我尝试访问扫描仪时。
我不知道如何才能获得更多信息。我正在Windows虚拟PC上测试我的小程序(以便使用ie7),并且没有在此环境中进行单步调试的方法。 (而且它在第三方代码上崩溃,无论如何我都没有来源)
最佳答案
我在这里只看到两个实用的选择:
- 使用可以毫无问题地处理卡纸的 API。当然,这说起来容易(获得强大的 API),但很难找到。
- 启动应用程序。自由 float 使用 Java Web Start 。如果它卡住了,用户可以终止它并单击新 JVM 中另一个实例的链接。或者,如果小程序可以检测到 DLL 的问题并且本身没有被卡住,那么它也可能会调用
BasicService.showDocument(URLof.jnlp)
。
当然,您还应该向..Asprise(?) 开发人员报告该错误。 最佳解决方案是从源头上解决问题。我们在这里所做的任何事情都是一种“解决方法”。
关于java - 从小程序重新启动 java.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12316271/