bat java 启动脚本_从bat脚本运行的Java应用程序上的Windows关闭挂钩

小编典典

在极少数情况下,虚拟机可能会中止,即在不完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在Unix上使用SIGKILL信号或在Microsoft

Windows上使用TerminateProcess调用。

因此,不幸的是,我认为在这里无事可做。

Windows控制台中的CTRL-

CLOSE信号。似乎不可调整。

引用以上链接:

CTRL+CLOSE当用户关闭控制台时,系统会生成信号。控制台上连接的所有进程均会接收信号,使每个进程都有机会在终止之前进行清理。当进程收到此信号时,处理程序函数在执行任何清除操作后可以采取以下操作之一:

调用ExitProcess以终止该过程。

返回FALSE。如果没有注册的处理程序函数返回TRUE,则默认处理程序将终止该过程。

返回TRUE。在这种情况下,不会调用其他处理程序函数,并且会弹出一个对话框询问用户是否终止该过程。如果用户选择不终止该过程,则系统将不会关闭控制台,直到该过程最终终止。

UPD 。如果您可以接受本机调整,则WinAPI SetConsoleCtrlHandler函数将为您消除默认行为打下基础。

UPD2

。关于Java信号处理和终止的启示是相对较老的文章,但是“

编写Java信号处理程序” 部分可能确实包含您所需要的内容。

UPD3 。我已经尝试了以上文章中的 Java信号处理程序

。它可以SIGINT很好地工作,但不是我们需要的,所以我决定随身携带SetConsoleCtrlHandler。结果有点复杂,可能不值得在您的项目中实现。无论如何,它可以帮助其他人。

因此,想法是:

保留对关闭处理程序线程的引用。

使用JNI设置自定义本机控制台处理程序例程。

在CTRL+CLOSE信号上调用自定义Java方法。

从该方法调用关闭处理程序。

Java代码:

public class TestConsoleHandler {

private static Thread hook;

public static void main(String[] args) {

System.out.println("Start");

hook = new ShutdownHook();

Runtime.getRuntime().addShutdownHook(hook);

replaceConsoleHandler(); // actually not "replace" but "add"

try {

Thread.sleep(10000); // You have 10 seconds to close console

} catch (InterruptedException e) {}

}

public static void shutdown() {

hook.run();

}

private static native void replaceConsoleHandler();

static {

System.loadLibrary("TestConsoleHandler");

}

}

class ShutdownHook extends Thread {

public void run() {

try {

// do some visible work

new File("d:/shutdown.mark").createNewFile();

} catch (IOException e) {

e.printStackTrace();

}

System.out.println("Shutdown");

}

}

本机replaceConsoleHandler:

JNIEXPORT void JNICALL Java_TestConsoleHandler_replaceConsoleHandler(JNIEnv *env, jclass clazz) {

env->GetJavaVM(&jvm);

SetConsoleCtrlHandler(&HandlerRoutine, TRUE);

}

和处理程序本身:

BOOL WINAPI HandlerRoutine(__in DWORD dwCtrlType) {

if (dwCtrlType == CTRL_CLOSE_EVENT) {

JNIEnv *env;

jint res = jvm->AttachCurrentThread((void **)(&env), &env);

jclass cls = env->FindClass("TestConsoleHandler");

jmethodID mid = env->GetStaticMethodID(cls, "shutdown", "()V");

env->CallStaticVoidMethod(cls, mid);

jvm->DetachCurrentThread();

return TRUE;

}

return FALSE;

}

而且有效。在JNI代码中,为清除起见,所有错误检查都被省略。关机处理程序将创建一个空文件"d:\shutdown.mark"来指示正确的关机。

所有的源代码编译的二进制文件的测试在这里。

2020-09-21

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C89和C99区别--简单总结

(1)对数组的增强 可变长数组  C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.可变长数组的维数在数组生存期内是不变的,也就是说,可…

四、spring boot 1.5.4 日志管理

spring boot日志默认采用logback进行输出&#xff0c;你可以对logback进行定制化&#xff0c;方法如下&#xff1a; 在resources文件夹下建立logback.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- base.xml i…

使用MyBatis和Spring构建Java Web应用程序

这篇文章将展示如何在Spring环境中使用带有MyBatis框架的MYSQL DB创建学生注册应用程序。 这是一个简单的应用程序&#xff0c;旨在在注册期间从用户收集输入详细信息&#xff0c;将详细信息保存在MYSQL DB中&#xff0c;并在登录期间对它们进行身份验证。 1.使用Maven模板创建…

codeforces 1136E-Nastya Hasn't Written a Legend

传送门&#xff1a;QAQQAQ 题意&#xff1a;有一个数组a和一个数组k&#xff0c;数组a一直保持一个性质&#xff1a;a[i 1] > a[i] k[i]。有两种操作&#xff1a;1&#xff0c;给某个元素加上x&#xff0c;但是加上之后要保持数组a的性质。比如a[i]加上x之后&#xff0c;a…

java打印word_Java jacob调用打印机打印word文档

前面说了Java如何生成复杂的Word文档&#xff0c;今年记录下Java如何调用打印机打印word文档。起初用的是自带的PrintJob&#xff0c;但是系统提供的打印机制并不成熟完整。网上的代码也是千篇一律&#xff0c;在我的打印设备Canon iR2525/2530 UFRII LT上&#xff0c;我能获取…

将Spring MVC RESTful Web服务迁移到Spring 4

1引言 Spring 4为MVC应用程序带来了一些改进 。 在这篇文章中&#xff0c;我将重点介绍宁静的Web服务&#xff0c;并通过采用Spring 3.2实现的项目并将其升级到Spring 4来尝试这些改进。以下几点总结了本文的内容&#xff1a; 从Spring 3.2迁移到Spring 4.0 变化中的Response…

layui的富文本编辑器怎么赋值

除了上面讲的方法外&#xff0c;还可以使用layedit自带的方法赋值/*** 设置编辑器内容* param {[type]} index 编辑器索引* param {[type]} content 要设置的内容* param {[type]} flag 是否追加模式*/layedit.setContent(index, content, flag);flag是true&#xff0c;是追加模…

java scrollpane 设置透明_java swing 之 JScrollPane(滚动面板)的使用

/*** java swing 之JScrollPane面板* 在设置界面时&#xff0c;可能会遇到在一个较小的容器窗体中显示一个较大部分的内容&#xff0c;这时可以使用* JScrollPane面板&#xff0c;JscrollPane面板是带滚动条的面板&#xff0c;也是一种容器&#xff0c;但是常用于布置单个* 控件…

cefsharp重写默认js弹窗(alert/confirm/prompt)

1.设置js弹窗控制器 webView.JsDialogHandler this; //js弹窗控制 this表示本类对象&#xff0c;所以本类要实现IJsDialogHandler接口 2.实现IJsDialogHandler接口接口方法 public bool OnJSAlert(IWebBrowser browser, string url, string message){MessageBox.Show(messa…

休眠事实:如何“断言” SQL语句计数

介绍 Hibernate简化了CRUD操作&#xff0c;尤其是在处理实体图时。 但是任何抽象都有其代价&#xff0c;而Hibernate也不例外。 我已经讨论了获取策略和了解Criteria SQL查询的重要性&#xff0c;但是您可以做更多的事情来统治JPA。 这篇文章是关于控制Hibernate代表您调用的SQ…

软件工程(2019)第三次个人作业

目录 软件工程第三次作业问题描述分析并设计程序程序流程图选择覆盖标准并设计测试样例软件工程第三次作业 项目地址 问题描述 题目(1)&#xff1a;最大连续子数组和&#xff08;最大子段和&#xff09; 背景 问题&#xff1a; 给定n个整数&#xff08;可能为负数&#xff09;组…

Flutter - 创建侧滑菜单

侧滑菜单在安卓App里面非常常见&#xff0c;比如Gmail&#xff0c;Google Play&#xff0c;Twitter等。看下图 网上也有很多创建侧滑菜单的教程&#xff0c;我也来记录一下&#xff0c;自己学习创建Drawer的过程。 1. 创建一个空的App import package:flutter/material.dart;cl…

java框架白话_Java NIO框架Netty教程(二) 白话概念

"Hello World"的代码固然简单&#xff0c;不过其中的几个重要概念(类)和 Netty的工作原理还是需要简单明确一下&#xff0c;至少知道其是负责什。方便自己以后更灵活的使用和扩展。声明&#xff0c;笔者一介码农&#xff0c;不会那么多专业的词汇和缩写&#xff0c;只…

js实现字体和容器宽高随窗口改变

用于字体大小和容器的宽高字体和宽高设为rem就可以了 var html document.documentElement;   function fonts(){   var hW html.offsetWidth;   var hS hW / 50;   html.style.fontSize hS "px"; } //浏览器窗口改变自动刷新 $(window).resize…

使用SWTEventHelper清除SWT侦听器通知

为基于SWT的UI编写测试通常需要以编程方式通知小部件侦听器。 不幸的是&#xff0c;用于创建&#xff0c;初始化并最终触发事件的代码有点冗长&#xff0c;并且分散了测试的实际目的。 在几次编写了类似的初始化例程之后&#xff0c;我想出了一个小实用程序类&#xff0c;它避免…

java逆向_Java逆向基础之异常

异常由之前月份处理修改的例子//清单1IncorrectMonthException.javapublic class IncorrectMonthException extends Exception {private int index;public IncorrectMonthException(int index) {this.index index;}public int getIndex() {return index;}}//清单2Month2.javac…

luogu4770 [NOI2018]你的名字 后缀自动机 + 线段树合并

其实很水的一道题吧.... 题意是&#xff1a;每次给定一个串\(T\)以及\(l, r\)&#xff0c;询问有多少个字符串\(s\)满足&#xff0c;\(s\)是\(T\)的子串&#xff0c;但不是\(S[l .. r]\)的子串 统计\(T\)本质不同的串&#xff0c;建个后缀自动机 然后自然的可以想到&#xff0c…

centos-7.2 node.js免编译安装

cd /usr/local/wget https://npm.taobao.org/mirrors/node/v8.9.3/node-v8.9.3-linux-x64.tar.gz tar -zxvf node-v8.9.3-linux-x64.tar.gz //已编译可以直接运行./bin下面的命令rm -rf node-v8.9.3-linux-x64.tar.gz //解压完删包 // 建立全局快捷方式 ln -s 源命令文件 快…

团队计划会议

跟航哥想了挺多要做什么&#xff0c;要完成什么&#xff0c;以什么为主要功能 提出了几个想法&#xff0c;并做了投票 最后决定一起做一个跑腿软件 最初的任务量&#xff1a; 跟航哥商量两个人一人负责两个模块 航哥负责管理员和下单 我负责接单跟其他琐碎的小功能 呐&#xff…

在基于Spring MVC的应用程序中配置favicon.ico

Favicon是与您的网站相关的图标&#xff08;favicon.ico&#xff09;。 并非每个网站都在使用favicon。 但是大多数浏览器并不关心它&#xff0c;反正他们都要求它。 当图标图标不在适当位置时&#xff0c;服务器将返回不必要的404 Not Found错误。 在典型的Spring MVC应用程序…