2017-05-30 5 views
1

あなたはすべての更新なしの窓8.1のvs2015の再配布を試してみて、インストールした場合、それはインストールに失敗します。しかし、それはあなたがレジストリ内の再配布の有無をチェックするプログラムを実行する場合、あなたはそのチェックを乗り越えるますので、GUIDがレジストリにある、インストールプロセスに十分でしょう。dllが見つからないためにWindowsのexeファイルが読み込まれない場合、事前にテストする方法はありますか?

インストールに失敗したdllの一部を必要とするvs2015でコンパイルされたプログラムを実行しようとすると、ドリルを知っているので「プログラムは開始できません...」というポップアップが表示されます。

私はこの問題を持っている、と私は.exeファイルを実行して、ポップアップを取得する前に、DLLが見つからない問題を検出する方法を見つけようとしている(NSIS付き)インストーラに取り組んでいます。コマンドラインツールを実行することができますか、それが起こる前にこの問題に私を手がかりにして呼び出すことができる任意のNSIS関数ですか?

あるいはvs2015の再配布が正しくインストールされているかどうかを確認する方法はありますか? (再配布可能ファイルのすべてのファイルが存在するかどうかを確認する必要はありません)。

この問題を解決するためのアイデアチェック。再配布可能ファイルがインストールに失敗する可能性があるあらゆる種類の方法があると私は期待しています。

+0

* "レジストリに再配布可能ファイルが存在するかどうかを確認するプログラムを実行する場合" * - プログラムの作成者に相談して、バグの実装を修正するように依頼してください。レジストリはパブリックプログラミングインターフェイスではありません。 – IInspectable

+0

レジストリへのアクセスをスニッフィングし、メッセージの前にどのキーにアクセスしているかを見つけるには、Windowsの場合は 'RegMon'を、プロセスモニタの場合は' Process Monitor'を使います。その後、インストーラーからそれを確認し、必要に応じてそれを削除し、再配布可能なものをあらかじめインストールします。私は、DLLベースのランタイムを使用しないことを好む - あなたのEXEに(静的リンク)を埋め込むオプションがあり、そのようなredistからの必要はありません。 – i486

+1

@IInspectable私は彼がVS2015再配布可能ファイルがインストールされているかどうかを知りたいと思うと思います。 –

答えて

3

私はVS2015がSystem32にWinSxSなしで.DLLsをインストールするバージョンの1つだと考えているので、vcruntime140.dll & msvcp140.dllが$SysDirにあるかどうかをチェックすることができます。

あなたはあなたがそれを読み込むことができれば、あなたが見ることができる部分をインストールするかもしれないと心配している場合は(あなたのインストーラは、インストールしているものののbitnessと一致すると仮定した場合):

!include LogicLib.nsh 
System::Call 'KERNEL32::LoadLibrary(t "$SysDir\msvcr100.dll")p.r0' 
${If} $0 P<> 0 
    DetailPrint "I was able to load the MSVC 2010 run-time DLL" 
${Else} 
    DetailPrint "Ooops" 
${EndIf} 

これは、Aと考えられるかもしれませんハックのビットが、それはあなたのニーズに十分かもしれない。 Dependency Walkerは、検索するDLLを教えてくれます。ご希望の場合は、また、NSISでMsiGetProductInfoを呼び出すことができます

!define MSVC2005_X86REDIST_PRODUCTCODE {A49F249F-0C91-497F-86DF-B2585E8E76B7} 
!define MSVC2008_X86REDIST_PRODUCTCODE {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4} 
!define MSVC2010_X86REDIST_PRODUCTCODE {196BB40D-1578-3D01-B289-BEFC77A11A1E} 
!define MSVC2010SP1_X86REDIST_PRODUCTCODE {F0C3E5D1-1ADE-321E-8167-68EF0DE699A5} 
!define MSVC2010_AMD64REDIST_PRODUCTCODE {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} 
!define MSVC2010SP1_AMD64REDIST_PRODUCTCODE {1D8E6291-B0D5-35EC-8441-6616F567A0F7} 

!define MSVCREDIST_PRODUCTCODE ${MSVC2010_X86REDIST_PRODUCTCODE} ; I don't have VS2015 redist installed on this machine so I could not test it. 
!include LogicLib.nsh 
System::Call 'MSI::MsiGetProductInfo(t "${MSVCREDIST_PRODUCTCODE}", t "ProductName", t"?"r1, *i${NSIS_MAX_STRLEN})i.r0' 
${If} $0 == 0 
    DetailPrint "ProductName: $1" 
    System::Call 'MSI::MsiGetProductInfo(t "${MSVCREDIST_PRODUCTCODE}", t "AssignmentType", t"?"r1, *i${NSIS_MAX_STRLEN})i.r0' 
    DetailPrint "AssignmentType: $1" 
    System::Call 'MSI::MsiGetProductInfo(t "${MSVCREDIST_PRODUCTCODE}", t "PackageCode", t"?"r1, *i${NSIS_MAX_STRLEN})i.r0' 
    DetailPrint "PackageCode: $1" 
    System::Call 'MSI::MsiGetProductInfo(t "${MSVCREDIST_PRODUCTCODE}", t "VersionString", t"?"r1, *i${NSIS_MAX_STRLEN})i.r0' 
    DetailPrint "VersionString: $1" 
${Else} 
    DetailPrint "Not registered with Windows Installer" 
${EndIf} 

This blog postは、Visual Studio 2005がMsiQueryProductState使用していて、任意の詳細を必要としない場合には、おそらく素敵なシンプルな選択肢であると述べています

!define INSTALLSTATE_DEFAULT 5 
System::Call 'MSI::MsiQueryProductState(t "${MSVCREDIST_PRODUCTCODE}")i.r0' 
${If} ${INSTALLSTATE_DEFAULT} = $0 
    DetailPrint "Installed" 
${Else} 
    DetailPrint "Not installed" 
${EndIf} 
+0

かなりおかげさまで、ありがとう。 – stu

+0

依存関係ウォーカーは更新されておらず、信頼性の低い情報が生成されています。たとえば、APIサーフェスをAPIセットに分離するために導入された、フォワーダDLLについては何も知られていません。 – IInspectable

+0

@IInspectableフォワーダDLLはどういう意味ですか?これは、古典的な "DLL.FuncName"フォワーダをサポートしています。 APIセットは理解されていませんが、AFAIKは書かれていません(WRTの内部フォーマットと使用方法)。 – Anders

関連する問題