星期三, 6月 01, 2022

[C#] 註冊 OCX

公司舊系統有使用上 mscomctl.ocx TreeView 元件,安裝舊系統時常常會忘記安裝,乾脆把元件嵌在 C# ERP 上,只要一執行就會自動安裝,透過 C# ERP 來輔助舊系統,參考該文章 - 现在介绍一种使用资源文件,将dll、ocx打包进exe,点击直接注册的例子 來完成

把 ocx 加入 Resource.resx 內

[C#] 註冊 OCX -1

把 ocx 加入後,在 Resource 資料夾內可以找到檔案,並把該檔案屬性建置動作,設定為內嵌資源

[C#] 註冊 OCX -2

在程式執行時,偵測 ocx 是否存在,沒有就進行 ocx 安裝和註冊
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

namespace OCXInstall
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Environment.SpecialFolder targettOS = GetBitOfOperatingSystem();
            string ocxName = "mscomctl.ocx";
            string fileFullName = Path.Combine(Environment.GetFolderPath(targettOS), ocxName);

            // 檔案存在就視同已經完成安裝和註冊
            if (File.Exists(fileFullName))
            {
                MessageBox.Show("檔案存在,不進行 OCX 註冊");
                return;
            }

            PutFileFromResource(fileFullName);
            RegisterDll(fileFullName);
        }

        /// <summary>
        /// 根據 OS 位元數,傳回對應系統資料夾完整路徑
        /// </summary>
        /// <returns>系統資料夾 (32bit:System32、64bit:SysWOW64)</returns>
        private Environment.SpecialFolder GetBitOfOperatingSystem()
        {
            Environment.SpecialFolder targettOS;
            if (Environment.Is64BitOperatingSystem)
                targettOS = Environment.SpecialFolder.SystemX86;
            else
                targettOS = Environment.SpecialFolder.System;

            return targettOS;
        }

        /// <summary>
        /// 把內嵌檔案抓出來存放在指定位置
        /// </summary>
        /// <param name="fileFullName">檔案完整路徑</param>
        private void PutFileFromResource(string fileFullName)
        {
            if (File.Exists(fileFullName)) return;

            byte[] fileData = Properties.Resources.mscomctl;
            File.WriteAllBytes(fileFullName, fileData);
        }

        /// <summary>
        /// 註冊 dll 或 OCX 檔案
        /// </summary>
        /// <param name="dllFullName">檔案完整路徑</param>
        public void RegisterDll(string dllFullName)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "Regsvr32.exe";
            startInfo.Arguments = " /s " + dllFullName;
            Process.Start(startInfo);
        }
    }
}
除了上述註冊 ocx 方式外,也可以把 regsvr32 語法寫成一個 bat,C# 只要執行該 bat 就行

regsvr32 參數說明,有應用到 /s 參數,程式執行時不要出現註冊成功訊息

   [C#] 註冊 OCX -3

測試時安裝時有反覆安裝、移除,發現移除時除了要反註冊 ocx 外,還要把檔案移除才算是完整移除,StackOverFlow 討論 上查到移除順序也是一個重點,要先反註冊後才能移除檔案,不能反過來

沒有留言:

張貼留言