私は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}
* "レジストリに再配布可能ファイルが存在するかどうかを確認するプログラムを実行する場合" * - プログラムの作成者に相談して、バグの実装を修正するように依頼してください。レジストリはパブリックプログラミングインターフェイスではありません。 – IInspectable
レジストリへのアクセスをスニッフィングし、メッセージの前にどのキーにアクセスしているかを見つけるには、Windowsの場合は 'RegMon'を、プロセスモニタの場合は' Process Monitor'を使います。その後、インストーラーからそれを確認し、必要に応じてそれを削除し、再配布可能なものをあらかじめインストールします。私は、DLLベースのランタイムを使用しないことを好む - あなたのEXEに(静的リンク)を埋め込むオプションがあり、そのようなredistからの必要はありません。 – i486
@IInspectable私は彼がVS2015再配布可能ファイルがインストールされているかどうかを知りたいと思うと思います。 –