1. 程式人生 > >我win專案中遇到的安裝以及自定義快捷方式及快捷鍵的實現方法

我win專案中遇到的安裝以及自定義快捷方式及快捷鍵的實現方法

首先我的需求是:

1、能自動安裝

2、桌面上有快捷方式,並且有快捷鍵,打快捷鍵能自動開啟程式執行

在開發中VS2010自帶的安裝可以將應用放到桌面生成快捷方式,但是有兩個問題:

一是不能自帶快捷鍵,需要手工另外增加;

二是開啟檔案位置找不到安裝目錄。

對於第二個問題我用orca工具設定快捷方式及應用本身的ARGUMENT,才能找到目錄。

但是第一個問題不能解決。

後經咱CSDN友提醒設定自定義安裝,新建安裝專案及安裝類,在建構函式裡寫

BeforeInstall及AfterInstall事件,事件裡面定義快捷鍵、安裝位置、圖示等其他屬性。

後反覆測試不得結果。原因是出錯。但是未提示錯誤。然後一直不得其解,後在一網友的分享中看到了解決方案。後面會補上該網友的分享。

我的解決方案就是通過真值判斷,直接THROW 問題點。一點一點跟蹤解決。問題全在於檔案的目錄上。目錄 一出錯,後面的操作均無效。

另外發現快捷鍵在beforeinstall中生成安裝後,是不起作用的。只有放在afterinstall中才有效。

我遇到的這些問題在網上不好百度到,希望分享能幫到同樣困惑的你~

補網友分享:

我在 Setup 專案的自訂動作(Custom Actions)裡經常會寫許多判斷,用以檢查安裝過程中一些必要的條件是否成立,例如資料庫是否可正常連線、適當的安裝引數是否有正常傳入、…等等。但是在檢查的過程中若發現條件不足時,正確的回應方式應該要使用 

InstallException 類別丟出例外狀況,讓安裝程式進行復原(Rollback)動作,但是這個 InstallException 例外狀況的「發生點」也是挺重要的。

一開始我都是用 override 的方式撰寫自訂動作:

public override void Install(IDictionary stateSaver)
{
  if(...)
     throw new InstallException("安裝過程發生錯誤");

    base.Install(stateSaver);
}

不過當錯誤發生時,卻會出現以下第二張圖的錯誤訊息:

Error 1001. 安裝過程發生錯誤

Error 1001. 在安裝的復原階段發生例外狀況。將略過此例外狀況,而繼續復原。然而,復原完成之後,電腦可能將無法完全還原成原來的狀態。 –> savedState 字典沒有包含預期的值,而且可能已經損毀。

如果是英文訊息的話,錯誤訊息如下:

Error 1001. An exception occurred during the Rollback phase of the installation. This exception will be ignored and the rollback will continue. However, the machine might not fully revert to its initial state after the rollback is complete. --> The savedState dictionary does not contain the expected values and might have been corrupted.

測試了一段時間後才發現,原來引發 InstallException 例外狀況時不能在 base.Install(stateSaver); 之前,否則當例外發生時就會出現這個奇怪的錯誤訊息。

到後來,我就全部改成用「事件」的方式撰寫自訂動作,當然,引發 InstallException 例外狀況時一樣要放在 AfterInstall 這個事件裡,範例程式如下:

public Installer1()
{
  //System.Diagnostics.Debugger.Launch();

  InitializeComponent();

  this.BeforeInstall += new InstallEventHandler(Installer1_BeforeInstall);
  this.AfterInstall += new InstallEventHandler(Installer1_AfterInstall);

  this.Committing += new InstallEventHandler(Installer1_Committing);
  this.Committed += new InstallEventHandler(Installer1_Committed);

  this.BeforeUninstall += new InstallEventHandler(Installer1_BeforeUninstall);
  this.AfterUninstall += new InstallEventHandler(Installer1_AfterUninstall);
}

相關連結