自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(414)
  • 资源 (11)
  • 收藏
  • 关注

原创 windows 固定ip多了一个169.254.xx.xx的ip的问题

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters下的IPAutoconfigurationEnabled字段(不存在就创建DWORD类型)设置为0,然后禁用网卡,启动网卡,ip里面的确没有169.254的ip了,很久之前有个问题,网络适配器查看详细信息,发现ip地址变成两个了,一个是设置的固定ip,一个是169.254开头的无效ip。查找tcpip/params的注册表,研究了每个字段。

2024-01-26 18:55:38 902

原创 boost编译静态库

根据命名方式发现直接执行b2没有static的-s-标志,如果要带上-s-标志,b2.exe的执行参数需要加上runtime-link=static。执行bootstrap.bat的时候会自动从系统中找最高版本的msvc编译器,本系统中是vs2019,也就是vc142。也就是先执行根目录的bootstrap.bat会生成b2.exe,然后执行b2.exe。根据6.3章节的描述,-s-是static的意思,可以直接编译到自己的二进制程序中。但是这种快速编译方式编出来的不是静态库。可通过此路径找到编译方法。

2023-12-13 20:57:39 220

原创 vue-cropper打包部署后运行报错i.call is not a function

既然本地运行良好,肯定直接引用vue肯定是可以用的,于是,将node_modules\vue-cropper\src目录下的vue-cropper.vue和exif-js-min.js复制到源码目录,将其当作组件调用。从npm安装的vue-cropper目录中看到vuecropper的源码,getComputedStyle的第一个参数时this.$refs.cropper,也就是说vuecropper根本就没有加载成功,标签名字已经不是用的vue-cropper,可以证明的确调用的是源码目录下的组件。

2023-10-13 01:59:00 934 9

原创 windows注册表引发的bug记录

1.widows桌面黑了,桌面上鼠标右键没反应,没有快捷方式,没有任务栏。现象很像杀死所有explorer.exe。但是ctl+alt+delete后通过任务管理器打开explorer.exe后只是弹出了资源管理器的窗口,桌面并没有恢复。发现shell的值不是explorer.exe,将其改为explorer.exe后执行taskkill /f /im explorer.exe,然后再次打开explorer.exe,桌面就出来了。

2023-09-16 10:33:24 226

原创 kylin系统gcc报错fatal error: stdio.h: 没有那个文件或目录

今天在kylin系统上写了一个简单的c语言代码,直接报错./main.c:1:10: fatal error: stdio.h: 没有那个文件或目录,apt安装build-essential后依然后问题,根据网上在ubuntu上的解决方案,尝试了aptitude的安装方式安装,还是有问题。报错需要依赖老版本libc6 (= 2.31-0kylin9.1k20.6),于是先重装老版本的libc6 (= 2.31-0kylin9.1k20.6),再安装libc6-dev。再次重新编译,就报正常的语法错误了。

2023-09-06 11:46:03 375

原创 linux shell函数和返回值

shell函数可以有返回值,但是只能返回0-255作为状态值,不能返回字符串,字符串可以通过其他方式传递给调用者。

2023-08-29 09:42:01 865

原创 linux shell进行数值计算

注意if[]中的-a要放在[]里面连接多个比较,并且[]前后里外都要有空格,declare -i的方式,后面的算式不能有空格,有空格相当于新的参数。4、-ge:大于等于,greater than or equal。5、-le:小于等于,less than or equal。最简单的方法1:$((这里写算式,可以写变量))1、-gt:大于,greater than。注意:$(())是计算,$()是执行命令。3、-lt:小于,less than。2、-eq:等于,equal。2、-o:或,or。

2023-08-28 17:42:54 267

原创 前端js后端nginx+php+workerman实现websocket通信

workerman默认是可以直接监听端口的,但是因为开发环境、防火墙、安全、其他项目等因素,js直接连服务器ip+端口,连不上,所以采用了nginx代理转发,server模块中添加如下location。workerman是纯PHP开发的开源PHP 应用容器,可以通过composer安装,目前因为要用到客户端与服务器实时通信,故使用了workerman中的websocket模块功能。2.服务端的send有两个参数,第二个可选参数不会当成数据发送,不要搞错了。3.根据worker示例编写代码。

2023-08-27 17:09:56 597

原创 条件变量与互斥锁

解锁mutex线程B获取到mutex,修改 ready,调用pthread_cond_signal发送信号,此时pthread_cond_wait返回,返回之前会加锁mutex,跳出while循环,然后解锁mutex。如果 线程B先获取到mutex,然后修改 ready 为 true,然后解锁锁mutex,接下来线程A 获取到mutex,read是true,不会进入到while里面的逻辑,直接解锁mutex。这里使用while,因为一般这种情况下线程A实例会被多次调用,生成多个线程,使用相同的逻辑。

2023-06-13 17:46:29 67

原创 关于windows异步命名管道通信的一些记录

要注意CreateEvent的第二个参数bManualReset:是否手动重置事件,一般手动设置的事件需要在事件触发后自行reset,是event处于无信号状态,如果是自动设置的事件,事件触发后,所有的wait结束后会自行变为无信号状态。客户端使用CreateFile打开命名管道,使用ReadFileEx和WriteFileEx进行管道的读写,经过测试,可以不用给overlap的hevent初始化,只需要有wait函数,读写完成后就能触发完成回调函数。分为服务端和客户端,参考。

2023-06-13 09:29:17 279

原创 windows修改程序图标后,快捷方式没有更新

最近换应用程序图标的时候发现程序的图标的确边了,但是快捷方式的图标还是以前的,双击打开快捷方式的时候,程序打开,任务栏上显示的图标是新的。右键查看快捷方式属性的时候,属性面板里显示的图标依然是新的,就是桌面上的快捷方式一直是旧的,很容易产生误解。关闭explorer.exe后再次打开explorer.exe不起作用,重启电脑也不起作用。清空icon缓存何缩略图缓存后,重启explorer.exe,终于眼前一亮。这里看到的都是icon缓存,将其清空后还有缩略图缓存。

2023-02-22 14:36:55 1542 1

原创 python查看库函数

以前查看python库的调用的时候,经常是百度,运气好的话能找到库的官网,但是每个库的查看方式还不一样。今天偶然发现python自己提供了本地查看的工具。就能看到本地python的库对应的文档了。

2023-01-30 10:32:44 529

原创 初识Linux内置命令

譬如 echo,既是 bash 的 builtin 命令也是一个独立的命令程序。根据 bash 中执行命令的优先级,对于同名的命令,内置命令会优先被执行,所以当我们在 bash 中直接输入 echo 命令时执行的是 bash 的 buildin 命令,如果要执行独立的命令程序 echo,则需要输入全路径 /usr/bin/echo。echo命令是内置命令,/usr/bin/echo和/usr/bin/read不一样,/usr/bin/echo是二进制程序,/usr/bin/read是可执行脚本。

2023-01-03 10:07:26 175

原创 Linux系统构建deb包

dpkg执行安装的之后只要有preinst、postinst、prerm、postrm中任意一个脚本,就报错,即使脚本内容为空。usr目录下的所有目录和文件会映射到 系统的 /usr 目录下。其他需要安装的目录可以和usr目录一样,由dpkg执行安装的时候复制到系统的目录。因为control文件中的Package字段对应的名字里面使用了下划线,把下划线去掉或者换成减号。DEBIAN中是包的信息control文件,和安装过程中执行的脚本文件。默认使用yum安装器,需要安装dpkg安装器。

2022-12-19 17:46:07 3124

原创 vue init webpack xxx报错timeout

如果直接下载zip,下载的名称是webpack-develop.zip,解压后将webpack-develop改名为webpack,然后将webpack复制到c:\users\xxxxx\.vue-templates目录里面。可以ping通,但是打不开网页,所以开了代理,但是执行git clone的时候还是报错timeout。但是这个报错的ip可以ping通。然后git clone执行成功了。最后需要同构如下命令取消配置。于是把自己的代理的端口配置到git命令中。今天创建项目的时候报错timeout。

2022-09-21 18:59:48 709

原创 终端截获ctrl+c,非阻塞获取按键事件

截获ctrl+c,通过api SetConsoleCtrlHandler监听部分事件,除了ctrl+c还有关机和账户退出事件。ctrl+c通过api signal注册回调事件SIGINT,也就是结束事件。kbhit判断当前是否已经有按键按下,如果有,就调用getch。默认getchar,fgetc需要敲回车后才会返回,按键之后直接返回,不用等待输入回车。windows非阻塞监听按键。linux非阻塞监听按键事件。

2022-09-16 11:04:26 420

原创 html打印pdf相关的问题

给期望的页尾部分设置style:page-break-after: always;设置了这个属性的dom,打印的时候该dom所在的最后一页的后面不会显示其他dom,下一个dom显示在下一页。不想分页的dom,比如div,设置style: page-break-inside: avoid;设置该dom或者上级dom的style:-webkit-print-color-adjust: exact;3.相邻dom连接太紧密,需要分页。2.关键dom被分页,防止分页。2.关键dom被分页,防止分页。

2022-09-08 15:08:03 719

原创 ios使用storyboard拖拽创建的WKWebView导致闪退

为什么其他控件拖上去是正常的,但是webview拖上去就闪退呢。百度之后发现别人也有这种问题。原来是 xcode不会自动添加webview的引用,可能是webview的库比较大吧,如果自动添加,无形中增加app的体积。xcode的ios项目,拖拽一个webview到storyboard,运行app时闪退,报错。已经提示了no xxx was found,明显是缺少库。添加wkwebview库。

2022-09-04 16:06:32 760

原创 php微信退款,提示证书验证失败

项目中的php微信支付和退费经过几轮商户账号的替换后,支付没问题,但是退费的时候提示证书验证失败,这种提示已经比较明显了,可是把项目中所有存放证书的路径都检查了一遍,也对比了下载时的文件内容。都是从商户页面下载下来的。跳转到对应的路径后发现原来是经过多次商户id的替换,目录用的是以前出过错的目录,检查路径时直接忽略掉了。有多个地方使用了相同的路径,需要注意多个地方使用了证书路径的话,需要注意不能遗漏。步骤也是正确的,只能看看项目中引用的api和路径。

2022-09-02 15:26:43 932

原创 Android Studio release版本 build正常 run失败提示INSTALL_PARSE_FAILED_NO_CERTIFICATES

signingConfigs和buildTypes的顺序是signingConfigs在前面,buildTypes在后面,如果尝试了一下,果然跟signingConfigs和buildTypes的顺序有关。把本项目的buildTypes放在signingConfigs后面,并且添加在buildTypes中添加signingConfig signingConfigs.release配置。修改后点击 sync now,再run一遍,神奇的模拟器中出现了app的界面,也不报错了。都没有成功,于是发现一个细节。..

2022-08-30 17:09:26 824

原创 ios开发入门

创建一个ios app后,直接点击run,xcode会启动手机模拟器,先显示的是lanuchScreen,launchScreen结束后触发application:(UIApplication *)application didFinishLaunchingWithOptions,鼠标按住Sent Event下面的事件列表中的其中一个右侧的圆圈,拖动到storyboard绑定的ViewController。如上,设置了按钮文字,还添加绑定事件的api,也就是动态绑定控件的回调事件。输入名称后,自动绑定。..

2022-08-27 18:27:36 930

原创 windows api获取软链接的目标路径

GetFinalPathNameByHandle可以获取软链接对应的真实设备路径,设备路径是\Device\HarddiskVolumex\xxxx\xxx,不知道盘符。GetVolumePathName可以通过\Device\HarddiskVolumex\xxxx\xxx获取到盘符c:\,但是不会自动拼接为盘符对应的文件全路径。QueryDosDevice可以通过盘符获取盘符c:对应的设备路径\Device\HarddiskVolumex。于是,做个拼接就可以了。.........

2022-08-11 11:37:35 965 1

原创 UEFI开发环境搭建

这里没有开发需要的代码和库,但是又很多资料文档,比如UEFI Specification就在Developer->Specification Library里面。该页面提供了UDK2015 Downloads的各种资源,我们开发需要的是workspaces,所以选择UDK2015 Workspace (ZIP File)该页面最下面提供了UDK各种版本的链接,2022年看到最新版本是UDK2018,由于公司用的是UDK2015,所以就选择了UDK2015,下载解压后有两个目录,三个压缩包,一个txt。...

2022-08-09 12:11:52 1232

原创 linux C获取Mac地址

此处是通过设置ifr_name,然后通过ioctl获取mac地址,ifr_name一般是eth0或者ens33。无论是否联网都可以获取到,但是当程序运行在其他客户端,不可能要求用户那里的网卡名称也是eth0,所以此方法仅能用作本地测试,或者用命令行方式传入网卡名称,然后获取指定网卡名称的mac地址。可是ifconfig命令不是更好用更方便吗?ioctl调用SIOCGIFCONF只能获取到活动网卡,如果把ens33或者eth0的网络连接断开,就获取不到了。1.基础用法,获取eth0的mac地址。.......

2022-07-28 19:58:08 2697

原创 docker环境安装vim、ifconfig、ping

大部分docker环境下没有vim命令,但是可以自行安装,直接执行apt-get install vim,失败网上百度一番,说是要使用国内镜像,可是不管使用163还是清华的镜像,都报错已尝试过多个debian版本的镜像,都是如此索性尝试一下原始的source.list直接执行这次居然成功了。再执行直接安装成功。接下来可以安装ifconfig命令了安装ping命令...

2022-06-29 16:26:45 1210

原创 guacamole安装

环境vmware+centos7非docker环境参考链接Installing Guacamole natively — Apache Guacamole Manual v1.4.0一.安装依赖包依赖包如参考链接中的Required dependencies,逐个yum install xxx即可,xxx用的试centos对应的devel包安装到ffmpeg的时候,报错:No package ffmpeg-devel available新的安装ffmpeg的方式二.下载安装guacamole-ser

2022-06-25 19:51:35 917

原创 安装docker guacamole

参考安装文档Installing Guacamole with Docker — Apache Guacamole Manual v1.4.0guacamole官网Apache Guacamole™一.安装docker安装后开启docker给root以外的用户docker权限docker的安装和使用就不多作介绍了。可以自行百度二.安装3个镜像官方支持PostgreSQL和MySQL两种数据库,没用过PostgreSQL所以就选用了MySqlguacamole/guacamole和gu

2022-06-20 18:23:31 2153 7

原创 windows10新增本地账户

添加windows10账户需要先激活windows,然后才能新增账户方法1.标准路径:打开windows设置:windows图标处,右键,设置进入【账户】设置,选择其他账户然后填写用户名即可方法2:命令行执行control userpasswords2点击添加 添加本地账户,即不使用microsoft账户登录 选择本地账户 输入用户名和密码 添加成功 本地用户中多了一个test用户,可以点击删除方法3:命令行执行lusrmgr.msc方式同方法1,不经过设置,直接打开本地用户和组............

2022-06-11 14:50:08 2560

原创 windows 7 iso镜像刻录到U盘后选择安装的版本

最近由于产品需求,要安装windows 7家庭版进行测试。直接通过PE安装后,系统启动不了,经过各种打听,原来是缺少usb3.0的驱动。排查问题的过程中发现一个奇怪的问题:pe安装系统的时候可以选择旗舰版、家庭版,但是如果把windows 7的iso文件刻录到U盘后,安装的时候不能选择安装的版本,一路下去直到看到了旗舰版的字样。这个问题倒不复杂,百度一番就有了答案,iso镜像中的\sources\ei.cfg文件可以配置当前iso镜像的版本[EditionID]Ultimate[Channel

2022-05-26 15:56:35 872

原创 etw监控文件操作开发示例

微软官方文档Event Tracing - Win32 apps | Microsoft Docsetw相关工具(目前主要用到logman查询providers)Event Tracing Tools - Win32 apps | Microsoft Docs简述:windows事件跟踪也就是windows event trace(etw)。主要分为三个模块:事件提供者(provider)、事件控制器(controller)、事件订阅者(consumer)。普通程序员一般用系统提供的事件

2022-04-29 17:46:38 3010 1

原创 cpu和内存占用过高,但是任务管理器中的进程占用的内存和cpu看不出来

不知道从什么时候电脑总是卡卡的,因为cpu和内存比较高配也就没想过占用率的事情,最近卡的受不了了,任务管理器中发现cpu和内存占用都超过90%,内存更是动辄96%以上,网上有一些介绍解决方案,我通过对比试验,没采取一种方案后重启看看,最近一次是禁用cotana和升级网卡驱动。

2022-04-20 10:17:06 7852 1

原创 devcon命令开启启用/禁用端口

今天测试一个外接设备的时候发现打开失败,跟硬件提供商沟通后,说是蓝牙设备占用端口了。需要禁用蓝牙端口设备,于是找了devcon禁用端口设备的方法。devcon在winDDK目录中可以找到,找到对应位数的程序,使用管理员权限打开命令行窗口,找到ports设备C:\Users\xxx\Desktop>devcon find =portsFTDIBUS\VID_0403+PID_6001+A10JYLAEA\0000 : USB Serial Port (C

2022-04-13 11:58:25 1898

原创 windows命令行程序被鼠标点击后阻塞

最近写python程序发现双击程序后弹出命令行窗口,如果鼠标不小心点击了窗口,整个窗口处于选择状态,但是程序不继续输出了,根据以往经验知道这是windows10上cmd窗口的选择模式导致的,可以手动解决:1.点击左上角图标选择属性2.取消快速编辑和插入模式如上,命令行窗口就不能通过鼠标选择了,但是每个程序都这么设置有点烦躁,于是就找了找windows控制台模式相关的api,发现如下apiSetConsoleMode function - Windows Console | Mic..

2022-04-07 16:37:59 1604

原创 不依赖MFC创建Win32窗口

Windows.h提供了CreateWindow系列的函数,自己注册一个class,然后就能创建窗口,创建之后需要在WndProc中处理Message#include <stdio.h>#include <tchar.h>#include <Windows.h>LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg)

2022-04-01 13:04:11 398

原创 mt-datetime-picker只显示了标题栏,时间选项是空白的

提前说解决方案:在项目引用的公有css文件中添加属性.picker-items{ width: 100% !important;}开发框架:vue + mint ui本地调试环境中使用<mt-datetime-picker></mt-datetime-picker>能显示标题栏的确定和取消,标题栏下面是可滚动选择的日期上线后iPhone手机,部分安卓手机也显示正常没有问题部分用户反馈选择时间的地方是空白的,局部截图如下用户反馈的问题没法联机调试,于是

2022-03-29 16:18:12 1739

原创 Reg命令查询注册表

命令行中执行reg /?,reg query /?即可知道reg的操作方式,此处做个记录,方便记忆reg执行哪些操作C:\Users\Administrator>reg /?REG Operation [Parameter List] Operation [ QUERY | ADD | DELETE | COPY | SAVE | LOAD | UNLOAD | RESTORE | COMP

2022-03-24 12:56:03 6480

原创 微信小程序集成vant

1.新建项目打开微信开发者工具,项目->新建项目,输入目录名称和小程序id2.命令行进入到微信小程序的目录参考https://vant-contrib.gitee.io/vant-weapp/#/quickstart但是按照该页面介绍操作的话,会提示【没有找到可以构建的NPM包,请确认需要参与构建的npm。。。。】npm init #一路回车npm i @vant/weapp -S --productionproject.config.json的同级目录创建mi

2022-03-23 20:42:01 2617 2

原创 visual studio 2019 + WinDDK 7600.16385.0编写驱动

驱动版本WinDDK 7600.16385.0IDE:visual studio 2019新建空白项目配置类型从exe改为生成文件配置完后,配置属性中就只剩基础配置了,没有C/C++、链接器等配置,因为驱动程序需要通过ddk编译,所以其他配置也是没用,自己配置编译程序的命令行即可添加makefile和source文件makefile是默认的,不需要修改的## DO NOT EDIT THIS FILE!!! Edit .\sources. if you want .

2022-03-23 19:05:14 2102

原创 windows程序执行没有输出也没有报错

今天编写了一个简单的程序验证系统环境,结果不管是双击打开,还是命令行打开都没有任何输出,明明main函数的入口就有打印的,不可能printf函数都出问题。如果有错的话,应该会弹窗报错才对。于是想到了以前排查问题时用到的事件查看器。然后根据时间和类型找到可以大概找到位置点击对应的条目后,常规信息中有程序的名字,这样就能确定出错的问题了。如上信息看起来像是以前的错误弹窗,这里只是没弹窗而已,错误信息是一致的,不影响排查问题的思路。如上时确实vcruntime140.dll,Visu.

2022-03-15 19:44:04 1442

原创 删除文件时提示需要**权限, 通过命令行修改文件/目录的所有者和权限

删除文件失败,错误码是5,手动删除的时候提示需要 trustinstaller权限通过cacls看一下所在目录的权限C:\Windows\system32>echo y | cacls "C:\Program Files\Internet Explorer\iexplore.exe"C:\Program Files\Internet Explorer\iexplore.exe NT SERVICE\TrustedInstaller:F

2022-03-15 15:41:51 2405

支持32位系统的msys

据说是最后一个支持32位系统的msys,之前下载了几次没下载下来,偶然发现能下载了,先存一份

2024-01-09

支持win7-32位的msys

解压后放到c盘,双击msys2.exe,就可以运行,由于没有走安装逻辑,双击后会跑一段时间的命令行,然后执行pacman -S gdb就能安装gdb gdb attach 进程ID,就能调试mingw编译的程序,mingw编译的参数要加CFLAGS="-g -O0"

2023-12-12

wdk 7600.iso

微软官方已经更新了wdk 7600,现在最老的wdk是wdk 7600_1,为了方便后续下载,先上传资源

2022-05-06

wdk 6001 18002 示例代码

wdk 6001 18002安装后,提取了src目录,src目录里面是6001的示例代码。7600以后删除了很多示例代码,为了方便研究,单独提取出来以便查阅

2022-05-06

wdk 6001 18002.iso

老版本的wdk,里面有一个老版本的samples,wdk 7600里面删除了部分代码示例,不便于了解框架的推进历程

2022-05-06

SCSI Primary Commands - 3

scsi的基础指令,好多结构在MSDN中没有定义,需要查找文档,此文档包含部分硬盘相关的信息

2022-03-10

从MS-CSVP中解析部分windows结构体

Intellectual Property Rights Notice for Open Specifications Documentation

2022-03-10

api-ms-dll.zip

QT 5.13.0+msvc 2017在windows 10上编译的程序运行在windows7上提示缺少api-ms-win-xxxxxxx.dll,网上一个一个找了缺失的32位的动态库,

2020-04-22

unlocker v3.0 + 老版本的darwin.iso

vmware14上亲测通过,可以安装osx10.14及以前版本的系统,但是v3.0里面的虚拟机工具不好用,所以压缩包分成unlocker目录+darwin.iso,右键以管理员权限执行完unlock-master中的win-install.cmd后,用压缩包根目录的darwin.iso替换D:\Program Files (x86)\VMware\VMware Workstation目录的darwin.iso,大小不一样(3,274K和3,022K,小的是老版本),所以应该很好判断,目录可能不一样。 安装完苹果系统后,不要急着安装虚拟机工具,先进恢复模式终端输入csrutil disable

2019-03-28

cl命令-编译c语言汇编程序

主要用到VC16目录下的cl.exe,用以编译c文件,形成obj文件,借助dos环境下的link命令可以生成com文件

2018-06-01

MASM611:汇编编译工具masm

汇编编译工具,主要用到bin目录下的masm,用以编译asm文件,形成obj文件,借助dos环境下的link命令可以生成com文件

2018-06-01

efibootmgr源码包

Windows操作EFI环境变量的方法为GetFirmwareEnvironmentVariable,SetFirmwareEnvironmentVariable linux系统如果是efi版本会有efibootmgr命令,至于具体实现可以参照efibootmgr的源码,

2015-11-25

uefi编程向导,方便创建uefi工程

建一个uefi的pkg需要很多文件,这个工具可以帮助手动生成部分代码

2015-01-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除