我有一个应用服务器(JBoss,但这也发生在Tomcat中),在Windows 2003中作为服务运行。它使用-Xrs
标志运行。
在应用服务器下运行的Java应用程序通过JNI调用一个用C++编写的可定制接口(这意味着我们可以修改这段代码),引用第三方DLL文件来处理图像(林肯用于转换PostScript)。
当我们以控制台(mstsc /console
)或管理员(mstsc /admin
)模式通过远程桌面连接登录到服务器时,当我们注销时,如果林肯DLL文件已经加载,应用服务器将确认注销信号,服务进程将立即终止而不受影响。
我相信信号是CTRL_LOGOFF
,但我可能是错的。
在JavaJiggle关于信号处理的文章之后,显然信号处理程序在DLL文件处理时传递给DLL文件。这意味着第三方DLL文件(在本例中为Lincoln)通过注销来侦听和响应CTRL_LOGOFF
信号。
我相信,我应该能够在我的C++接口中为DLL编写一个信号捕捉器,以便在CTRL_LOGOFF
到达DLL之前拦截它,如果是这样的话,那么当有人从控制台/admin登录时,我们不会经常死掉。
我需要的是:
CTRL_LOGOFF
,对吗?我找到了微软的文章http://msdn.microsoft.com/en-us/library/windows/desktop/ms685049%28v=vs.85%29.aspx,这可能有助于回答这个问题。
发布于 2011-10-12 14:21:39
我似乎是通过每次调用第三方DLL时向堆栈添加一个忽略处理程序来解决这个问题的,但我担心每次调用我的方法时,我们都会继续向堆栈中添加处理程序,而且很明显,第三方DLL不会删除它的处理程序。我不知道这是否造成了内存泄漏。
是否有办法防止第三方处理程序被放在第一位?我问了一个后续问题来回答这个问题:https://stackoverflow.com/questions/7747388/how-can-i-prevent-a-3rd-party-dll-from-adding-console-control-handlers-in-windows。
下面是我的自定义JNI类方法,它调用第三方DLL文件:
JNIEXPORT jint JNICALL Java_com_company_ConvertProxy_convertToImageType(JNIEnv *env, jclass cls, jstring input, jstring output) {
jboolean isCopy;
inFilename = env->GetStringUTFChars(input, &isCopy);
outFilename = env->GetStringUTFChars(output, &isCopy);
// I tried to call SetConsoleCtrlHandler() here, but failed;
// it turns out third-party code in ConvertImage() also
// calls SetConsoleCtrlHandler and overrides it if placed here.
int value = ConvertImage();
// Deafen Control Logoffs set by third-party ConvertImage.
// SetConsoleCtrlHandler( NULL, TRUE ); // DOES NOT WORK, must use custom CtrlHandler.
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
return value;
}
BOOL CtrlHandler( DWORD fdwCtrlType ) {
switch( fdwCtrlType )
{
// Handle the CTRL-C signal.
case CTRL_C_EVENT:
return( TRUE );
// CTRL-CLOSE: confirm that the user wants to exit.
case CTRL_CLOSE_EVENT:
return( TRUE );
case CTRL_BREAK_EVENT:
return( TRUE );
case CTRL_LOGOFF_EVENT:
return( TRUE );
case CTRL_SHUTDOWN_EVENT:
return( TRUE );
default:
return FALSE;
}
}
https://stackoverflow.com/questions/7704979
复制