关键字: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提示软件日志.相关推荐

  1. 安装CleanMyMac 3提示软件已损坏

    2019独角兽企业重金招聘Python工程师标准>>> 安装CleanMyMac 3提示软件已损坏,出现这样的原因是往往是使用了CleanMyMac 3破解版,主要是因为CleanM ...

  2. 怎么关掉android升级提示,【技巧】手机不停提示软件更新,是更新好还是不更新好?怎么去掉提示?...

    原标题:[技巧]手机不停提示软件更新,是更新好还是不更新好?怎么去掉提示? 用手机时,最烦人的事情之一,除了没电,估计就是不停的显示各种软件更新了.不知道大伙有么有同感? 更新吧,又不太敢随便更,不更 ...

  3. 小白易语言注册机post 取短信内容、单线程实战,软件日志 day06

    取短信内容 代码如下: 这里是引用.版本 2 .支持库 iext .支持库 spec .计次循环首 (30, i) 超级列表框1.置标题 (N, 4, "第[" + 到文本 (i) ...

  4. android 自动更新提示,为什么手机会提示软件更新?手机如何关闭自动更新提示?...

    用手机时,最烦人的事情之一,除了没电,估计就是不停的显示各种软件更新了.不知道大伙有么有同感?更新吧,又不太敢随便更,不更新吧,很可能你的手机界面就会变成这样,红一片--为什么手机会提示这些软件更新? ...

  5. macOS清除beta版本系统提示命令

    macOS清除beta版本系统提示命令 只要开启过体验macOS体验版后,系统会经常推出来,以前为了尝鲜,经常用,但是近段时间macOS的beta版本不稳定,偶尔会搞出点事情来,但是下面的提示更新系统 ...

  6. 软件日志(系统日志)

    自己是个C#菜鸟,写了些小东西,但是调试起来总是很麻烦.后来发现大牛们都用什么"日志"来记录软件执行的操作(好像叫软件日志还是系统日志,我就暂取软件日志),这样便于调试,还有就是在 ...

  7. 电脑系统服务器事件日志不可用,windows10系统提示事件日志服务不可用如何解决...

    当windows10系统在遇到一些问题重新开机的时候,我们就可以使用事件管理器功能来查看具体原因,可是有不少用户在打开事件日志服务的时候,却遇到了提示事件日志服务不可用,该如何解决呢,本教程就给大家讲 ...

  8. 清除ubuntu下缓存、软件安装包和多余内核

    在默认情况下ubuntu 会把我们通过apt-get 所安装的软件包保存在缓存文件夹里.我们可以把这个文件夹做个备份.如果需要重装Ubuntu时,可以把备份还原回去.这样就不需要连上网络去大量更新系统 ...

  9. android崩溃拦截给出提示显示日志

    这里先贴出布局图片,作用一看就懂了. 异常捕获网上有类似的,很多.这个aar的作用主要是帮助开发,有时候手机并没有连着电脑,所以看错误日志比较方便,可以复制粘贴. 这个aar里没有网上说的日志上传啥的 ...

  10. VUE+ElementUI的表单el-from表单验证二选一必填项,并且满足条件后会清除表单验证提示。

    效果图: 使用Element-UI的自定义验证实现. 这里面有个坑是,两个input输入框都点出了提示信息,填写任一输入框之后只有操作的那一项的验证提示消失了,不主动清除另一项的验证提示就会一直存在, ...

最新文章

  1. 扩展卡尔曼滤波EKF与多传感器融合
  2. 幂运算 数组_Super Pow:如何高效进行模幂运算
  3. APACHE如何里一个站点绑定多个域名?用ServerAlias
  4. Vue项目代码改进(四)—— 在使用ElementUI时点击同一个路由,页面报错
  5. Java集合unmodifiableSortedSet()方法(带示例)
  6. Python基础(三)--序列
  7. python sklearn 梯度下降法_科学网—Python_机器学习_总结4:随机梯度下降算法 - 李军的博文...
  8. 【记录】jenkins 安装及环境配置(一)
  9. [Office一般性操作] 关闭Outlook重定向
  10. 【转载】浅谈嵌入式MCU开发中的三个常见误区
  11. 同志亦凡人第一季/全集BQueer As Folk 1迅雷下载
  12. 【程序人生】Web前端工程师岗位分析报告
  13. linux添加凤凰引导,凤凰系统率先升级内核到Linux4.9
  14. 文献综述是什么?怎么写?内附简洁模板
  15. Win11有几个版本 Windows 11各版本区别对比
  16. linux找不到安装命令,linux命令行为什么输入sudo ./configure提示找不到命令
  17. 面试运维宝典专栏的小伙伴,互联网老辛来给你送福利了
  18. 乾颐堂安德华为数通HCNA真题解析版(第2部分)
  19. 使用XUL开发跨平台桌面应用
  20. 配置和使用Nexus私有仓库

热门文章

  1. java strom实例_strom wordcount java 实现案例
  2. c语言用二维数组遍历 “tic tac toe“ 输出游戏结果
  3. 使用 Sprinkles 构建您自己的类型安全版本的 Tailwind CSS
  4. 2004年1月六级听力原文的启示:每顿饭后刷牙牙齿好
  5. Cubieboard2开发要点简记
  6. 【2022年度总结2023新年Flag】--2022:高考失利,我奋力奔跑的大一上;2023,朝着成为更优秀的自己迈进ing
  7. 怎样解除网络宽带限制
  8. vue项目中获取今天,昨天,明天时间方法
  9. android ota升级服务,android OTA 升级包含增量升级
  10. BF,KMP算法(万字图文详解)