1

私は、汎用エンジン、いくつかのプログラム固有のコンテンツ、およびコンテンツ内の数ギガバイト相当のメディアの更新を可能な限り効率的に処理するためのカスタム自動アップデーターを含むプログラムに取り組んでいます。エンジンの最近のリリースでは、ディレクトリ構造が再編成され、実行可能ファイルを(たとえば)c:\Program Files\Program\Engine.exeにインストールする代わりに、現在にインストールc:\Program Files\Program\engine\win32\NewEngine.exeされています(このプロセスでエンジンの名前も変更されていることに注意してください)。

問題は、プログラムを起動するために、ユーザーがショートカットを使用する必要があることです。ショートカットは、スタートメニューと(オプションで)デスクトップにインストールされます。ただし、更新後のエンジンの移動は、これらのショートカットを壊します。そこで、プログラムを起動するためにユーザーが持っているすべてのショートカットを修正する方法を見つける必要があります。

Unix / Mac OS Xのバックグラウンドから来ているので、私の傾向は、古い実行可能ファイル名から新しい実行可能ファイル名へのシンボリックリンクを作成することです。私の知る限り、Windowsには実際にはシンボリックリンクに相当するものはありません(グーグルから、Vista以降にシンボリックリンクがあることがわかりますが、これはXPで機能する必要があります)。私の仮定は間違っていますか?Windows上で実行可能ファイルへのシンボリックリンクに相当するものはありますか?

頭に浮かぶ他のいくつかの可能な解決策は次のとおりです。

  1. 古い場所に小さな実行可能ファイルを作成して、新しい場所で実際の実行可能ファイルを起動します。別のプログラムを起動するだけの、シンプルでヘッドレスな実行可能ファイルをすばやく簡単に作成する方法はありますか?繰り返しになりますが、Unixでは、シェルスクリプトを作成するだけですが、私が知る限り、.batファイル.exeに名前を付けて実行することはできないため、これは実際にを生成する方法である必要があります.exe
  2. 更新時に、実行可能ファイルを指すすべてのショートカットを検索して編集します。特定の場所を指すシステム上のすべてのショートカットを見つけて更新する(効率的で信頼性の高い)方法はありますか?
  3. 上記の組み合わせと、ショートカットから起動されていることを検出し、実際のプログラムを起動する前にそのショートカットを編集する小さな実行可能ファイル。プログラムがショートカットから起動されていることを検出して、そのショートカットを編集できるようにする方法はありますか?

これらのオプションのいずれかが機能しますか?もしそうなら、どのように機能しますか?Windowsでこの種のことを行うための最良の方法は何ですか?ショートカットをある場所から別の場所にリダイレクトする他の方法がありませんか?

編集して追加:いくつかの追加要件:

  1. 私たちのユーザーの多くは非技術的です。ユーザーの介入を必要とするソリューションは問題外です。
  2. これは可能な限りシームレスである必要があります。ユーザーがショートカットをクリックするたびに余分なウィンドウがポップアップすることは許容できません。
  3. これは、スタートメニューの再配置や、クイック起動バーへのショートカットの移動など、ユーザーが実行できるほとんどのことに対して堅牢である必要があります。
  4. 私たちのショートカットは、エンジンがコンテンツをロードするために必要な引数を渡すため、プログラムの機能に絶対に必要です(はい、これは理想的ではありません。これを修正したいのですが、現時点ではできません)
  5. 比較的迅速で実装が簡単で、非常に信頼性の高いものを探しています。
4

6 に答える 6

3

奇妙なことに、誰もNTFS Hard Linksについて言及していません。

参考文献:

于 2010-01-13T03:47:31.527 に答える
1

アップデートのインストール中にショートカットを上書きできないのはなぜですか?

ユーザーが作成した可能性のあるすべてのショートカットではなく、デフォルトのショートカットのみを上書きする必要があります。それでも、この2番目のケースでは、オプション1を使用できますが、そうです、実際の実行可能ファイルである必要があります。

(ユーザーが非標準の場所に3番目のショートカットを作成した場合、それが何を意味するのか、またはコピーされたショートカットが機能しないときに情報を探す場所を知っていると安全に推測できます。警告を出すこともできます。アップデータのどこかで変更に注意してください。)

あなたが本当にあなたが述べたことをしたい(すべてのショートカットを更新する)なら、あなたはここで受け入れられた答えの方法の拡張でそれをすることができます。.lnkファイルを検索し、 TargetPathが古いエンジンの場所であるかどうかを確認し、古い場所である場合は更新します。

于 2009-10-10T04:55:30.380 に答える
1

ShellExecute()のMSDNドキュメントから、COMを初期化する必要があるかもしれないことに気づきました。また、実行可能ファイルへのフルパス(相対パスではない)を指定する必要があります。または、フルパスの代わりにショートカットでENVIRONMENT変数を使用することもできます。新規インストール中にENVIRONMENT変数を変更して、新しいパスを反映させることができます。

于 2009-10-19T09:10:35.170 に答える
1

さて、私たちが決定した解決策は、実際のエンジンを起動する小さな小さな実行可能ファイルを実行することです。プロジェクトをセットアップするには、私が望んでいたよりも Visual Studio を少しいじりましたが、うまくいっているようです。

#include "stdafx.h"
#include <shellapi.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
  HINSTANCE result = ShellExecute(NULL, _T("open"), 
                                  _T("engine\\win32\\NewEngine.exe"),
                                  lpCmdLine, NULL, 1);
  // ... handle errors ...
  return 0;
}

編集:いいえ。これは XP では機能するようですが、Windows 7 や Vista では機能しません。Windows 7 または Vista でこれが失敗する理由についてのアイデアをいただければ幸いです。これをすぐに理解できない場合は、これを別の質問に分割する可能性があります。

編集2:ああ。XP では、パス名のスラッシュは問題なく機能します。Vista 以降では、バックスラッシュが必要です。

于 2009-10-13T15:31:34.330 に答える
0

これは私にはインストーラーの問題のように聞こえます。アップグレード中に、古いバージョンをアンインストールして新しいバージョンをインストールしてみませんか?私はInnoSetupに精通していませんが、これがInstallShieldインストーラーをアップグレードする方法です。ユーザーが手動でショートカットを作成する場合、これはケースを処理しません。ただし、ユーザーはそれを再作成することができます。簡単な検索と置換に関しては、努力する価値はないと思います。

于 2009-10-11T14:02:30.320 に答える
0

ShellExecute の代わりに、CreateProcess または spawn に相当するものを試してください。私は CreateProcess に賭けます。

于 2009-10-14T10:20:02.303 に答える