把 ocx 加入 Resource.resx 內
把 ocx 加入後,在 Resource 資料夾內可以找到檔案,並把該檔案屬性建置動作,設定為內嵌資源
在程式執行時,偵測 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 參數,程式執行時不要出現註冊成功訊息
沒有留言:
張貼留言