0

以前のリリースの 1 つでサービス コンポーネントを 2 回インストールしました。

<Component Id="MyServiceWin7" Guid="{GUID_WIN7}">
<File Id="mysvc_Win7"
      Name="mysvc.exe"
      Source=mysvc.exe"
      KeyPath = "yes"/>
<ServiceControl Id="MYSVC_Win7"
                Name="MYSVC"
                Remove="uninstall"
                Start="install"
                Stop="both"
                Wait="no" />
<ServiceInstall Id="My_Svc_Win7"
                Name="MYSVC"
                DisplayName="MYSVC"
                Type="ownProcess"
                Start="auto"
                ErrorControl="normal"
                LoadOrderGroup=""
                Description="My service">
</component>

<Component Id="MyServiceWin8" Guid="{GUID_WIN8}">
<File Id="mysvc_Win8"
      Name="mysvc.exe"
      Source=mysvc.exe"
      KeyPath = "yes"/>
<ServiceControl Id="MYSVC_Win8"
                Name="MYSVC"
                Remove="uninstall"
                Start="install"
                Stop="both"
                Wait="no" />
<ServiceInstall Id="My_Svc_Win8"
                Name="MYSVC"
                DisplayName="MYSVC"
                Type="ownProcess"
                Start="auto"
                ErrorControl="normal"
                LoadOrderGroup=""
                Description="My service">
</component>

したがって、MYSVC コンポーネントの 2 つのインスタンスが存在します。どちらも MYSVC.exe にマッピングされています。

以前のリリースでは、OS バージョンの条件チェックを見逃していました。

正常に実行されます。

次回のアップデートでダミーの追加コンポーネント(GUID_Win7またはGUID_WIN8)を削除しようと考えています。

どうすれば削除できますか? カスタム アクションを作成する必要がありますか?

どんな助けでも大歓迎です。

編集:: 答えを見つけてください、

  1. mysvc には、Win7 および Win8 に固有のサード パーティ ライブラリ依存関係があります。これは、sc qc mysvc を確認すると、正常にインストールされたことを意味します。サービスが作成され、mysvc.exe がサービス binpath にマップされます。

  2. はい、これら 2 つのサービス コンポーネントは同じ宛先をターゲットにしており、sc query mysvc を実行すると、コンポーネントは 1 つだけです。

  3. いいえ、サービスのエントリは 1 つだけです。mysvc.exe はディスク上の win8 バージョンです。

提案をありがとう、その壊れたリンク。

現在、win 7 と win8 の両方に %ProgramFiles%\MyApp\mysvc.exe 共通パスがあります。だから私の質問は、前のリンクを壊すために新しい共通パスを作成するかどうかです。ProgramFiles%\MyApp\mysvc\mysvc.exe [[NEW_GUID1]] for win7 ProgramFiles%\MyApp\mysvc\mysvc.exe [[NEW_GUID2]] for win8

[[OLD_GUID1]] 、[[OLD_GUID2]] を持つコンポーネントは、私の製品がアンインストールされるまで永遠にシステム上にあるため、[[OLD_GUID1]]、[[OLD_GUID2]] を持つコンポーネントを削除して古い (機能しない) コンポーネントをクリーンアップすることはできません。

ありがとう

4

1 に答える 1

1

いくつかの質問:

  • まず、サービスを 2 つのフレーバーでインストールすることにした理由をお聞かせください。これは、サービスが Win7 と Win8 で異なるバイナリを持っているということですか? もしそうなら、それがそのまま機能するとあなたが言う理由は不明です。
  • これらのサービス コンポーネントは 2 つの異なるインストール先をターゲットにして、両方が並行して実行されるようにしますか? それとも、両方のコンポーネントで同じターゲット先をターゲットにしますか? (したがって、インストール後のファイルのインスタンスは 1 つだけです)。
  • インストール後、ボックスのサービスのリストに 2 つのエントリがありますか? 両方のコンポーネントで同じ場所をターゲットにする場合、どのファイル バージョンがmysvc.exeディスクに作成されましたか? (それらが異なる場合)。

上記の質問の前に以下を書きました。質問への回答で質問を更新してください。以下は無関係かもしれません - もっと情報が必要です。


過去の罪: 以前のバージョンで 2 つの異なるコンポーネントGUIDを使用して同じファイルを 2 回インストールした場合、これは誤りです。新しいリリースと決定的に:各コンポーネントの新しい絶対インストール場所を設定します(2 つの異なる GUID で同じ絶対キー パスをターゲットにしないでください! - 条件の有無にかかわらず)。

アイデアは、古いバージョンと新しいバージョンを分離して、クリーンな状態から開始することです。

何かのようなもの:

Comp 1: {77777777-7777-7777-7777-777777777777}, [ProgramFilesFolder]My App\Win7\mysvc.exe

Comp 2: {42424242-4242-4242-4242-424242424242}, [ProgramFilesFolder]My App\Win8\mysvc.exe

個人的には、Windows のバージョン番号は避けて、別のものを使用するかもしれません。一年どう?

Comp 1: {77777777-7777-7777-7777-777777777777}, [ProgramFilesFolder]My App\2007\mysvc.exe

Comp 2: {42424242-4242-4242-4242-424242424242}, [ProgramFilesFolder]My App\2014\mysvc.exe

たとえば、Win8バージョンがWin10で実行されている場合、誤解を招くような値をハードコーディングしないでください。

注意!:上記のサンプル GUID はよく知られた機能不全の GUIDであるため、コピーして使用しないでください。これは非常に重要です:-)。

于 2018-07-18T13:08:50.013 に答える