удалить исполняемый файл в Windows ce

#c# #.net #compact-framework #windows-ce

#c# #.net #compact-framework #windows-ce

Вопрос:

я хочу создать деинсталлятор в Windows ce.

Проблема в том, что я хочу удалить сам деинсталлятор после выполнения всего остального.

Возможно ли это как-то? Или есть какой-то способ сделать unistaller другим способом?

Комментарии:

1. Ну же, кто-нибудь, дайте мне оценку моему ответу! Я на самом деле использую его в нашем установщике для Windows CE.

2. Sry, но это не сработало в моем проекте…

Ответ №1:

Вы можете просто переместить приложение в корзину. Это боль, потому что для этого вам нужно использовать P / Invoke с неинтуитивной структурой. Этот образец должен помочь в этом.

         private bool Recycle(string path)
    {
        try
        {
            ShowProgress(string.Format("Moving {0} to Recycle bin.", path));
            SHFILEOPSTRUCT sfo = new SHFILEOPSTRUCT();
            sfo.hwnd = IntPtr.Zero;
            sfo.wFunc = FO_DELETE;
            sfo.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
            sfo.pFrom = path  ''   '';
            sfo.pTo = null;
            sfo.fAnyOperationsAborted = false;
            sfo.hNameMappings = IntPtr.Zero;
            sfo.lpszProgressTitle = string.Empty;
            int ret = SHFileOperation(ref sfo);

            return (ret == 0);
        }
        catch (Exception ex)
        {
            ShowProgress(string.Format("Failed to move {0} to Recycle bin.", path));
            ShowProgress(ex.ToString());
        }
        return false;
    }


    // SHFileOperation wFunc and wFunc values
    public const uint FO_MOVE = 0x0001;
    public const uint FO_COPY = 0x0002;
    public const uint FO_DELETE = 0x0003;
    public const uint FO_RENAME = 0x0004;

    public const ushort FOF_MULTIDESTFILES = 0x0001;
    public const ushort FOF_CONFIRMMOUSE = 0x0002;
    public const ushort FOF_SILENT = 0x0004; // don't create progress/report
    public const ushort FOF_RENAMEONCOLLISION = 0x0008;
    public const ushort FOF_NOCONFIRMATION = 0x0010; // Don't prompt the user.
    public const ushort FOF_WANTMAPPINGHANDLE = 0x0020;// Fill in SHFILEOPSTRUCT.hNameMappings
                                                    // Must be freed using SHFreeNameMappings
    public const ushort FOF_ALLOWUNDO = 0x0040;
    public const ushort FOF_FILESONLY = 0x0080;  // on *.*, do only files
    public const ushort FOF_SIMPLEPROGRESS = 0x0100;  // means don't show names of files
    public const ushort FOF_NOCONFIRMMKDIR = 0x0200;  // don't confirm making any needed dirs
    public const ushort FOF_NOERRORUI = 0x0400;  // don't put up error UI
    public const ushort FOF_NOCOPYSECURITYATTRIBS = 0x0800;  // dont copy NT file Security Attributes
    public const ushort FOF_NORECURSION = 0x1000;  // don't recurse ushorto directories.

    //[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
    //If you use the above you may encounter an invalid memory access exception (when using ANSI
    //or see nothing (when using unicode) when you use FOF_SIMPLEPROGRESS flag.
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        public uint wFunc;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pFrom;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pTo;
        public ushort fFlags;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpszProgressTitle;
    }

    [DllImport("ceshell.dll")]
    public static extern int SHFileOperation([In] ref SHFILEOPSTRUCT lpFileOp);
  

Ответ №2:

killer.cmd:

 :a
del uninstaller.exe
if exist uninstaller.exe goto a
del killer.cmd
  

Запустите его перед выходом из программы удаления, поэтому uninstaller.exe он будет удален, как только это станет возможным, а затем killer.cmd также будет удален.

// Хотя, не уверен, есть ли .cmds в CE.