我在我的应用程序/进程中使用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句柄以及是否可以避免这种情况?