1. 程式人生 > >windows mobile ,wince 系統,用代碼啟動cab文件安裝

windows mobile ,wince 系統,用代碼啟動cab文件安裝

highlight PV ops set win32 pac oev poi net

有時候需要用代碼來啟動安裝cab,以下是代碼。不能實現靜默安裝。

啟動後會提示用戶是否安裝,需要用戶點擊是才行。

using System;

using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;
public class BLLInstallCab
{

    #region Const

    private const int STILL_ACTIVE = 0x103;

    #endregion

    #region P/Invoke

    [DllImport("coredll.dll", EntryPoint = "CreateProcess", SetLastError = true)]
    private static extern bool CreateProcess(string pszImageName, string pszCmdLine, IntPtr psaProcess, IntPtr psaThread, int fInheritHandles, int fdwCreate, IntPtr pvEnvironment, IntPtr pszCurDir, IntPtr psiStartInfo, ProcessInfo pi);

    [DllImport("coredll.dll", SetLastError = true)]
    private static extern bool GetExitCodeProcess(int hProcess, ref int lpExitCode);

    #endregion

    public sealed class ProcessInfo
    {
        public IntPtr hProcess = IntPtr.Zero;
        public IntPtr hThread = IntPtr.Zero;
        public int dwProcessID = 0;
        public int dwThreadID = 0;
    }

    /// <summary>
    /// 安裝指定目錄下多Cab包
    /// </summary>
    /// <param name="SetupDir">Cab包目錄路徑</param>
    public void SetupFiles(string SetupDir)
    {
        if (System.IO.Directory.Exists(SetupDir) == true)
        {
            ProcessInfo pi = new ProcessInfo();
            DirectoryInfo DirInfo = new DirectoryInfo(SetupDir);
            FileInfo[] Files = DirInfo.GetFiles("*.cab");
            foreach (FileInfo file in Files)
            {
                bool rc = CreateProcess("windows\\wceload.exe", "\"" + file.FullName + "\" /nodelete",
                    IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, pi);

                int lpExitCode = STILL_ACTIVE;

                int ErrorCode = 0;

                while ((rc == true) && (lpExitCode == STILL_ACTIVE))
                {
                    Application.DoEvents();
                    rc = GetExitCodeProcess(pi.hProcess.ToInt32(), ref lpExitCode);
                    if (rc == true)
                    {
                        if (lpExitCode == STILL_ACTIVE)
                            System.Threading.Thread.Sleep(1000);
                    }
                    else
                    {
                        ErrorCode = Marshal.GetLastWin32Error();
                    }
                }
            }
        }
    }

    /// <summary>
    /// 檢查系統安裝CF版本
    /// </summary>
    /// <param name="version">版本</param>
    /// <returns></returns>
    //private bool HaveNETCF2(char version)
    //{
    //    RegistryKey NETCFKey = null;
    //    try
    //    {
    //        bool Result = true;
    //        NETCFKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\.NETCompactFramework", false);
    //        if (NETCFKey == null)
    //            return Result;
    //        string[] valueNames = NETCFKey.GetValueNames();
    //        if (valueNames == null)
    //        {
    //            NETCFKey.Close();
    //            return Result;
    //        }
    //        for (int i = 0; i < valueNames.Length; i++)
    //        {
    //            //枚舉註冊表Software\\Microsoft\\.NETCompactFramework\CF版本值
    //            if ((valueNames[i] != null) && (valueNames[i].Length > 0) && (valueNames[i][0] == version))
    //            {
    //                Result = true;
    //                break;
    //            }
    //            else
    //            {
    //                Result = false;
    //            }
    //        }
    //        return Result;
    //    }
    //    catch
    //    {
    //        return false;
    //    }
    //    finally
    //    {
    //        if (NETCFKey != null)
    //            NETCFKey.Close();
    //    }
    //}
}

  

windows mobile ,wince 系統,用代碼啟動cab文件安裝