清除Marco1!$A$1提示软件日志.
关键字:delphi Marco clean
最近一个朋友的客户老是发一些报价文件会提示marco1提示的文件,再发过去,对方又不敢看,怕有毒.
经查,其实这种文件是曾经中过毒,杀毒后,有部分没有清理干净的原因,比较有空,所以帮他编了一个软件.
一.构思
功能一.拖放清除,二系统右键清除.
二.功能细节分解:
拖放功能,可以百度delphi 文件拖放.
右键可以用相关注册表操作,具体可以下载一个右键管理软件来看要对注册表作什么具体工作.
三.实现具体情况:
1.拖放功能.
TFORM1中增加声明.
Procedure FileIsDropped(Var Msg: TMessage); message WM_DropFiles;
后面增加定义:
Procedure TForm1.FileIsDropped(Var Msg: TMessage);
Var
hDrop: THandle;
fName: Array[0..254] Of CHAR;
NumberOfFiles: integer;
fCounter: integer;
Names: String;
Begin
hDrop := Msg.WParam;
NumberOfFiles := DragQueryFile(hDrop, $FFFFFFFF, Nil, 254);
Names := '';
For fCounter := 0 To NumberOfFiles - 1 Do
Begin
DragQueryFile(hDrop, fCounter, fName, 254);
// Here you have your file name 1 by 1
// Names := Names + #13#10 + fName;//调试用信息
//showmessage(ExtractFileExt(fname));
If ExtractFileExt(fName) = '.xls' Then
Begin
CM(fName);//清除尾巴
End;
End;
//ShowMessage('Droped ' + inttostr(NumberOfFiles) + ' Files : ' + Names);//调试用信息
DragFinish(hDrop);
End;
难度不大
2.右键功能才是比较难的,主要一如何操作注册表,二该写什么数据进注册表,如何传文件名给程序,都一度难倒了我.
一样一样的说:
注册表操作部分:
Procedure RegServer();//注册函数
Var
AR: TRegistry;
Begin
AR := TRegistry.Create();
AR.RootKey := HKEY_CLASSES_ROOT;
If AR.OpenKey('Excel.Sheet.8\shell\', True) Then
Begin
AR.CreateKey('CleanMarco');
AR.OpenKey('CleanMarco', True);
AR.WriteString('', 'CleanMarco');
AR.WriteBool('AutoClose', True);
AR.WriteBool('AllDir', false);
AR.CreateKey('Command');
AR.OpenKey('Command', True);//在当前注册表目录打开下一层目录,可以理解为DOS下的CD.
//ar.WriteString( 'CleanMarco', application.ExeName );
// ar.WriteString( '', application.ExeName );
AR.WriteExpandString('', Application.ExeName + ' /C %1');//传参数进程序.用string不行,无法运行,必须用expandstring
//ar.WriteString( 'Command', application.ExeName );
End;
ShowMessage('注册右键成功,迎使用!');
//善后处理
AR.CloseKey;
AR.Free;
//ar.Destroy ;
End;
Procedure UnRegServer();
Var
AR: TRegistry;
SL: TStringList;
Begin
AR := TRegistry.Create();
AR.RootKey := HKEY_CLASSES_ROOT;
SL := TStringList.Create;
If AR.OpenKey('Excel.Sheet.8\shell\', True) Then
Begin
AR.OpenKey('CleanMarco', True);//没有使用递归,步骤很烦.
AR.GetKeyNames(SL);
ShowMessage(SL.Text);
AR.DeleteValue('AutoClose');
AR.DeleteValue('AllDir');
AR.OpenKey('Command', false);
AR.DeleteValue('');
AR.CloseKey;
AR.RootKey := HKEY_CLASSES_ROOT;
AR.OpenKey('Excel.Sheet.8\shell\', True);
AR.OpenKey('CleanMarco', True);
AR.DeleteKey('Command');
AR.DeleteValue('');
AR.CloseKey;
AR.RootKey := HKEY_CLASSES_ROOT;
AR.OpenKey('Excel.Sheet.8\shell\', True);
AR.DeleteKey('CleanMarco');
//ShowMessage(inttostr(SL.Count));
AR.DeleteKey('CleanMarco');
End;
ShowMessage('右键功能卸载成功,谢谢使用!');
//善后处理
AR.CloseKey;
AR.Free;
//ar.Destroy ;
End;
参数传送部分:
Procedure TForm1.FormCreate(Sender: TObject);
Var
S, CmdStr, ArgStr, TaskStr, TargeFileName: String;
J, L, L1: integer;
AR: TRegistry;
Begin
DragAcceptFiles(Handle, True);
//Showmessage(ParamStr(0));
AR := TRegistry.Create();
AR.RootKey := HKEY_CLASSES_ROOT;
If AR.OpenKey('Excel.Sheet.8\shell\', True) Then //这样子.只能支持excel2003
Begin
AR.OpenKey('CleanMarco', True);
bAutoClose := AR.ReadBool('AutoClose');
bAllDir := AR.ReadBool('AllDir');
chkB1.Checked := bAllDir;
ChkB2.Checked := bAutoClose;
End;
AR.Destroy;
L1 := length(paramstr(1));
//Label1.Caption := inttostr(L1);
S := rightstr(paramstr(1), 1);
If (S = 'i') Or (S = 'I') Then
Begin
//直接安装
// showmessage('AutoInstall!');
Button1Click(Sender);
End;
If (S = 'C') Or (S = 'c') Then
Begin
//清除MArco1尾巴
CmdStr := GetCommandLine;//为防目录中有空格必须用这个取得完整命令行再处理...这个用了一天的时间都没有解决的问题
//后来想到用OD时经常看到的命令,就上这个了,这是一个winAPI,引用windows即可用.
//Label3.Caption := application.ExeName;
L := length(Application.ExeName);
If leftstr(CmdStr, 1) = '"' Then L := L + 3;
ArgStr := trim(rightstr(CmdStr, length(CmdStr) - L - L1)); //获取参数命令。
// Label1.Caption := ArgStr;
J := posex(' ', ArgStr, 2);
TaskStr := trim(leftstr(ArgStr, J)); //执行任务的命令这里不用。
TargeFileName := trim(rightstr(ArgStr, length(ArgStr) - J - L1)); //目标文件或目录。
If bAllDir Then
Begin
CleanMarco(ExtractFilePath(TargeFileName)); //清除整个目录
End
Else
Begin
CleanMarco(TargeFileName); //单个文件清除。
End;
If bAutoClose Then Application.Terminate;
End;
//showmessage(inttostr(length(s) );
End;
最后功能实现
Procedure CM(FileName: String);//具体处理函数
Var
ExcelApp, sht: Variant;
// FileName: String;
i, sC: integer;
Begin
//FileName := 'F:\myFiles\delphi\CleanMacro\bak\测试\2222.xls';
If FileExists(FileName) Then
Begin
Try
ExcelApp := CreateOleObject('Excel.Application');
Except
ShowMessage('Excel 没有安装,请先安装!');
exit;
End;
ExcelApp.Visible := True;
ExcelApp.workbooks.open(FileName);
ExcelApp.ScreenUpdating := false; //禁用刷新
ExcelApp.AskToUpdateLinks := false; //不更新链接
ExcelApp.DisplayAlerts := false; //不提示窗口
ExcelApp.EnableEvents := false;
ExcelApp.Calculation := xlCalculationManual;//对于有很多公式的文件这个很重要,不然,改一下,卡你半天.....这是我从VBA得到的经验....
//ListBox1.Clear;
sC := ExcelApp.activeworkbook.sheets.count;
//ListBox1.Items.Add('表格数:' + inttostr(sC));
For i := sC Downto 1 Do
Begin
sht := ExcelApp.activeworkbook.sheets[i];
//ListBox1.Items.Add(sht.Name + inttostr(sht.type));
If (lowercase(leftstr(sht.Name, 5)) = 'macro') Or (sht.type = xlExcel4IntlMacroSheet) Or (sht.type = xlExcel4MacroSheet) Then
Begin
sht.Visible := True;
sht.delete;
End;
End;
sC := ExcelApp.activeworkbook.Names.count;
For i := sC Downto 1 Do
Begin
If (ExcelApp.activeworkbook.Names.item(i, EmptyParam, EmptyParam).Visible = false) Then
ExcelApp.activeworkbook.Names.item(i, EmptyParam, EmptyParam).delete;//excel名称的访问,试了很多次,后来这样过掉了,
//网上很少有这个信息,自己看函数接口文件,处理的.
End;
ExcelApp.Calculation := xlCalculationAutomatic;
// ExcelApp.activeworkbook.activesheet.cells(1, 1) := '`Ymf';//测试工作,正式版要注释掉.
ExcelApp.activeworkbook.save;
ExcelApp.activeworkbook.close;
ExcelApp.DisplayAlerts := True; //'恢复提示窗口
ExcelApp.AskToUpdateLinks := True; //'恢复更新链接
ExcelApp.ScreenUpdating := True; //'恢复屏幕刷新
// excelapp.close;
ExcelApp.quit;
sht := unassigned;
ExcelApp := unassigned;
End;
End;
Procedure CleanMarco(iFileName: String);
Var
S, Ss: String;
FileList: Tstrings;
sr: TSearchRec;
Begin
S := ExtractFileExt(iFileName);
Ss := rightstr(iFileName, 1);
If (Ss = '\') Or (Ss = '/') Then
Begin
//整目录清除。
FileList := TStringList.Create;
FileList.Clear;
If DirectoryExists(iFileName) Then
Begin
S := iFileName + '*.xls';
If FindFirst(S, faAnyFile, sr) = 0 Then
Begin
Repeat
If pos('.xls', lowercase(sr.Name)) > 0 Then
FileList.Add(sr.Name);
CM(iFileName + sr.Name);
Until FindNext(sr) <> 0;
FindClose(sr);
End;
End;
End
Else
Begin
If S = '.xls' Then
Begin
//单文件清除
CM(iFileName);
End;
End;
End;
转载于:https://www.cnblogs.com/CatDo/p/4502902.html
清除Marco1!$A$1提示软件日志.相关推荐
- 安装CleanMyMac 3提示软件已损坏
2019独角兽企业重金招聘Python工程师标准>>> 安装CleanMyMac 3提示软件已损坏,出现这样的原因是往往是使用了CleanMyMac 3破解版,主要是因为CleanM ...
- 怎么关掉android升级提示,【技巧】手机不停提示软件更新,是更新好还是不更新好?怎么去掉提示?...
原标题:[技巧]手机不停提示软件更新,是更新好还是不更新好?怎么去掉提示? 用手机时,最烦人的事情之一,除了没电,估计就是不停的显示各种软件更新了.不知道大伙有么有同感? 更新吧,又不太敢随便更,不更 ...
- 小白易语言注册机post 取短信内容、单线程实战,软件日志 day06
取短信内容 代码如下: 这里是引用.版本 2 .支持库 iext .支持库 spec .计次循环首 (30, i) 超级列表框1.置标题 (N, 4, "第[" + 到文本 (i) ...
- android 自动更新提示,为什么手机会提示软件更新?手机如何关闭自动更新提示?...
用手机时,最烦人的事情之一,除了没电,估计就是不停的显示各种软件更新了.不知道大伙有么有同感?更新吧,又不太敢随便更,不更新吧,很可能你的手机界面就会变成这样,红一片--为什么手机会提示这些软件更新? ...
- macOS清除beta版本系统提示命令
macOS清除beta版本系统提示命令 只要开启过体验macOS体验版后,系统会经常推出来,以前为了尝鲜,经常用,但是近段时间macOS的beta版本不稳定,偶尔会搞出点事情来,但是下面的提示更新系统 ...
- 软件日志(系统日志)
自己是个C#菜鸟,写了些小东西,但是调试起来总是很麻烦.后来发现大牛们都用什么"日志"来记录软件执行的操作(好像叫软件日志还是系统日志,我就暂取软件日志),这样便于调试,还有就是在 ...
- 电脑系统服务器事件日志不可用,windows10系统提示事件日志服务不可用如何解决...
当windows10系统在遇到一些问题重新开机的时候,我们就可以使用事件管理器功能来查看具体原因,可是有不少用户在打开事件日志服务的时候,却遇到了提示事件日志服务不可用,该如何解决呢,本教程就给大家讲 ...
- 清除ubuntu下缓存、软件安装包和多余内核
在默认情况下ubuntu 会把我们通过apt-get 所安装的软件包保存在缓存文件夹里.我们可以把这个文件夹做个备份.如果需要重装Ubuntu时,可以把备份还原回去.这样就不需要连上网络去大量更新系统 ...
- android崩溃拦截给出提示显示日志
这里先贴出布局图片,作用一看就懂了. 异常捕获网上有类似的,很多.这个aar的作用主要是帮助开发,有时候手机并没有连着电脑,所以看错误日志比较方便,可以复制粘贴. 这个aar里没有网上说的日志上传啥的 ...
- VUE+ElementUI的表单el-from表单验证二选一必填项,并且满足条件后会清除表单验证提示。
效果图: 使用Element-UI的自定义验证实现. 这里面有个坑是,两个input输入框都点出了提示信息,填写任一输入框之后只有操作的那一项的验证提示消失了,不主动清除另一项的验证提示就会一直存在, ...
最新文章
- 扩展卡尔曼滤波EKF与多传感器融合
- 幂运算 数组_Super Pow:如何高效进行模幂运算
- APACHE如何里一个站点绑定多个域名?用ServerAlias
- Vue项目代码改进(四)—— 在使用ElementUI时点击同一个路由,页面报错
- Java集合unmodifiableSortedSet()方法(带示例)
- Python基础(三)--序列
- python sklearn 梯度下降法_科学网—Python_机器学习_总结4:随机梯度下降算法 - 李军的博文...
- 【记录】jenkins 安装及环境配置(一)
- [Office一般性操作] 关闭Outlook重定向
- 【转载】浅谈嵌入式MCU开发中的三个常见误区
- 同志亦凡人第一季/全集BQueer As Folk 1迅雷下载
- 【程序人生】Web前端工程师岗位分析报告
- linux添加凤凰引导,凤凰系统率先升级内核到Linux4.9
- 文献综述是什么?怎么写?内附简洁模板
- Win11有几个版本 Windows 11各版本区别对比
- linux找不到安装命令,linux命令行为什么输入sudo ./configure提示找不到命令
- 面试运维宝典专栏的小伙伴,互联网老辛来给你送福利了
- 乾颐堂安德华为数通HCNA真题解析版(第2部分)
- 使用XUL开发跨平台桌面应用
- 配置和使用Nexus私有仓库
热门文章
- java strom实例_strom wordcount java 实现案例
- c语言用二维数组遍历 “tic tac toe“ 输出游戏结果
- 使用 Sprinkles 构建您自己的类型安全版本的 Tailwind CSS
- 2004年1月六级听力原文的启示:每顿饭后刷牙牙齿好
- Cubieboard2开发要点简记
- 【2022年度总结2023新年Flag】--2022:高考失利,我奋力奔跑的大一上;2023,朝着成为更优秀的自己迈进ing
- 怎样解除网络宽带限制
- vue项目中获取今天,昨天,明天时间方法
- android ota升级服务,android OTA 升级包含增量升级
- BF,KMP算法(万字图文详解)