Webbrowser控件中的Java Applet打破了stdin

时间:2014-05-01 14:34:19

标签: java winapi applet webbrowser-control atl

我在我的应用程序/进程中使用IE WebBrowser控件。它是在Windows上运行在32位应用程序中的ATL实现的。

此过程使用GetStdHandle& amp;从stdin读取。 ReadFile的。

每当WebBrowser控件呈现带有java applet的页面时(例如此页面上的applet:http://csis.pace.edu/~bergin/Java/applets.htm),Java引擎中的某些东西就会关闭stdin句柄。

结果是ReadFile返回FALSE,GetLastError()返回ERROR_PIPE_BROKEN。

我尝试使用SetHandleInformation来阻止关闭句柄,它应该成功,但句柄仍然被打破。

我需要stdin才能工作,因为这是我与调用过程的沟通渠道。

我确实找到了解决此问题的方法,但想知道是否有更好的解决方案。

解决方法

解决方法是在启动时获取stdio句柄,然后将它们从任何其他调用者隐藏,以便Java引擎稍后找不到并中断它们。例如:

// Sock the handles away
HANDLE hStdIn  = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hStdErr = GetStdHandle(STD_ERROR_HANDLE);

// Hide them from anyone else, especially Java
SetStdHandle(STD_INPUT_HANDLE,  INVALID_HANDLE_VALUE);
SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
SetStdHandle(STD_ERROR_HANDLE,  INVALID_HANDLE_VALUE);

有更好的解决方案吗?或者任何人都可以解释为什么Java applet正在关闭stdio句柄以及是否可以避免这种情况?

0 个答案:

没有答案