繁体   English   中英

如何以编程方式自行删除? (C#WinMobile)

[英]How to programmatically self delete? (C# WinMobile)

我如何以编程方式自行删除?

C#/ .NET Compact Framework 2 / Windows Mobile 6

拜托,我不想讨论为什么这样做 ,我只需要知道怎么做

重要:

  • “第二次申请”方法不是一种选择。 (除非第二个应用程序可以从正在运行的应用程序“提取”,但我不知道该怎么做!)。

  • 强制重启没问题,如果windows在启动时做了伎俩。 (有可能吗?很好!告诉我如何!)。

  • 欢迎使用代码示例。

我可以想到的唯一方法是删除自己并且不留痕迹的是使用设备中已存在的东西 - 即wceload(CAB提取器)。 我创建了一个简单的CAB文件,其中包含一个自定义安装程序DLL,它执行等待然后删除。

然后我将CAB作为嵌入式资源添加到应用程序中。 当你需要删除你

  1. 将CAB解压缩到文件系统
  2. 使用CAB作为参数和/ noui(或/ silent)执行wceload.exe
  3. 退出您的申请

然后,CAB会删除您的文件(命名的互斥锁可以比DLL中的Sleep调用更好地同步)。 wceload会自动删除CAB(完全取决于WinMo版本,但如果需要,还有一个强制删除的开关)。

它肯定是一个黑客,但它会提供一个“不留痕迹”删除。 当然,CAB可能也必须清理它自己的安装注册表项。 也许你可以让安装返回“失败”,以防止它们首先被写入。

我正在使用此代码,它工作正常

string AppPath = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location).ToString() + "\\Uninstaller.exe";

ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C choice /C Y /N /D Y /T 0 & Del " + AppPath;
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);

我过去只是将批处理文件写入文件系统,等待几秒钟然后删除程序。 然后使用Process.Start()启动批处理文件并立即调用Environment.Exit() 您需要确保批处理文件等待足够长的时间才能关闭程序,否则它将无法运行。

Windows可以在启动时删除文件。 可以通过调用MoveFileEx来完成:

MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);

我不确定该API是否在Mobile 6中可用。 但是,它实际上是在HKEY_LOCAL_MACHINE \\ System \\ CurrentControlSet \\ Control \\ Session Manager \\ PendingFileRenameOperations中创建一个注册表项。 键是REG_MULI_SZ,您只需要给它一个像“szDstFile \\ 0 \\ 0”的值。 在重新启动时,Windows会删除该文件。

至于以编程方式重新启动,请在SO上查看线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM