make 64-bit shell extensions work, put 64-bit VC runtime in the same dir

Unlike in case of msvcr90.dll, which went to WinSxS, msvcr100.dll is installed
to the "system32" folder. Windows installer automatically replaces it to
SysWOW64. The problem is that this way 64-bit dlls end up in the wrong directory.
They conflict with the 32-bit dlls, and will not be installed. Therefore
64-bit shell extensions will not work, unless the 64-bit VC runtime is
installed from other source. It is not possible to install both 32-bit and
64-bit VC Runtime with merge modules in case of VS 2010 and VS 2012.
For the 64-bit shell extensions, we can install the runtime dlls next to the files.

Change-Id: I157048a521662bbac568d1660e46576935f0ea9f
diff --git a/configure.ac b/configure.ac
index c5aeffb..dcff809 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4877,48 +4877,30 @@ find_msms()
            else
                AC_MSG_ERROR([Merge module Microsoft_VC90_CRT_x86_x64.msm not found])
            fi
        else
            if test -e $msmdir/Microsoft_VC${VCVER}_CRT_x64.msm; then
                msms="$msms Microsoft_VC${VCVER}_CRT_x64.msm"
            else
                AC_MSG_ERROR([Merge module Microsoft_VC${VCVER}_CRT_x64.msm not found])
            fi
        fi
    fi
}

find_msvc_dlls()
find_msvc_x64_dlls()
{
    if test "$CPUNAME" = "INTEL"; then
        vsarch=x86
    elif test $VCVER = 9; then
        vsarch=amd64
    else
        vsarch=x64
    fi

    msvcdllpath="$VC_PRODUCT_DIR/redist/$vsarch/Microsoft.VC${VCVER}.CRT"
    MSVC_DEBUG_DLL_PATH="$VC_PRODUCT_DIR/redist/Debug_NonRedist/$vsarch/Microsoft.VC${VCVER}.DebugCRT"
    msvcdlls="msvcp${VCVER}.dll msvcr${VCVER}.dll"
    MSVC_DEBUG_DLLS="msvcp${VCVER}d.dll msvcr${VCVER}d.dll"
    if test "$VCVER" = "90"; then
        msvcdlls="$msvcdlls msvcm90.dll Microsoft.VC90.CRT.manifest"
        MSVC_DEBUG_DLLS="$MSVC_DEBUG_DLLS msvcm90d.dll Microsoft.VC90.DebugCRT.manifest"
    fi

    for dll in $msvcdlls; do
        if ! test -f "$msvcdllpath/$dll"; then
            AC_MSG_ERROR([can not find $dll in $msvcdllpath])
        fi
    done
    if test -n "$MSVC_USE_DEBUG_RUNTIME"; then
        for dll in $MSVC_DEBUG_DLLS; do
            if ! test -f "$MSVC_DEBUG_DLL_PATH/$dll"; then
                AC_MSG_ERROR([can not find $dll in $MSVC_DEBUG_DLL_PATH])
    if test "$VCVER" != "90"; then
        msvcdllpath="$VC_PRODUCT_DIR/redist/x64/Microsoft.VC${VCVER}.CRT"
        MSVC_DEBUG_DLL_PATH="$VC_PRODUCT_DIR/redist/Debug_NonRedist/$vsarch/Microsoft.VC${VCVER}.DebugCRT"
        msvcdlls="msvcp${VCVER}.dll msvcr${VCVER}.dll"
        MSVC_DEBUG_DLLS="msvcp${VCVER}d.dll msvcr${VCVER}d.dll"
        for dll in $msvcdlls; do
            if ! test -f "$msvcdllpath/$dll"; then
                AC_MSG_ERROR([can not find $dll in $msvcdllpath])
            fi
        done
        if test -n "$MSVC_USE_DEBUG_RUNTIME"; then
            for dll in $MSVC_DEBUG_DLLS; do
                if ! test -f "$MSVC_DEBUG_DLL_PATH/$dll"; then
                    AC_MSG_ERROR([can not find $dll in $MSVC_DEBUG_DLL_PATH])
                fi
            done
        fi
    fi

}

if test "$build_os" = "cygwin"; then
@@ -6086,7 +6068,7 @@ AC_SUBST([JITC_PROCESSOR_TYPE])

# Misc Windows Stuff
if test $_os = "WINNT" -a "$WITH_MINGW" != yes; then
    find_msvc_dlls
    find_msvc_x64_dlls
    find_msms
    MSVC_DLL_PATH="$msvcdllpath"
    MSVC_DLLS="$msvcdlls"
diff --git a/scp2/source/ooo/vc_redist.scp b/scp2/source/ooo/vc_redist.scp
index 283ba9c..82cd0d0 100644
--- a/scp2/source/ooo/vc_redist.scp
+++ b/scp2/source/ooo/vc_redist.scp
@@ -87,26 +87,4 @@ End

#endif

#if defined(WITH_VC100_REDIST)

MergeModule gid_MergeModule_Microsoft_VC100_CRT_x64
    Feature = gm_Root;
    Name = "Microsoft_VC100_CRT_x64.msm";
    RootDir = "TARGETDIR";
    ComponentCondition = "(VC_REDIST=1) AND VersionNT64";
End

#endif

#if defined(WITH_VC110_REDIST)

MergeModule gid_MergeModule_Microsoft_VC110_CRT_x64
    Feature = gm_Root;
    Name = "Microsoft_VC110_CRT_x64.msm";
    RootDir = "TARGETDIR";
    ComponentCondition = "(VC_REDIST=1) AND VersionNT64";
End

#endif

#endif
diff --git a/scp2/source/winexplorerext/file_winexplorerext.scp b/scp2/source/winexplorerext/file_winexplorerext.scp
index f2a2a89..ce8dc1c 100644
--- a/scp2/source/winexplorerext/file_winexplorerext.scp
+++ b/scp2/source/winexplorerext/file_winexplorerext.scp
@@ -95,3 +95,47 @@ File gid_File_Lib_Shlxtmsi
    Dir = SCP2_OOO_BIN_DIR;
    Name = "shlxtmsi.dll";
End

#ifdef BUILD_X64

#if defined(WITH_VC100_REDIST)

File gid_File_Lib_Msvcr100
    LIB_FILE_BODY;
    Styles = (PACKED);
    Dir = gid_Dir_Shlxthdl;
    Name = "msvcr100.dll";
    ComponentCondition = "VersionNT64";
End

File gid_File_Lib_Msvcp100
    LIB_FILE_BODY;
    Styles = (PACKED);
    Dir = gid_Dir_Shlxthdl;
    Name = "msvcp100.dll";
    ComponentCondition = "VersionNT64";
End

#endif

#if defined(WITH_VC110_REDIST)

File gid_File_Lib_Msvcr110
    LIB_FILE_BODY;
    Styles = (PACKED);
    Dir = gid_Dir_Shlxthdl;
    Name = "msvcr110.dll";
    ComponentCondition = "VersionNT64";
End

File gid_File_Lib_Msvcp110
    LIB_FILE_BODY;
    Styles = (PACKED);
    Dir = gid_Dir_Shlxthdl;
    Name = "msvcp110.dll";
    ComponentCondition = "VersionNT64";
End

#endif

#endif
diff --git a/scp2/source/winexplorerext/module_winexplorerext.scp b/scp2/source/winexplorerext/module_winexplorerext.scp
index 3932e4f..6756a30 100644
--- a/scp2/source/winexplorerext/module_winexplorerext.scp
+++ b/scp2/source/winexplorerext/module_winexplorerext.scp
@@ -51,5 +51,9 @@ Module gid_Module_Optional_Winexplorerext_x64
    Dirs = (gid_Dir_Shlxthdl);
    Files = (gid_File_Lib_Shlxthdl64,
             gid_File_Lib_OOoFilt64,
             gid_File_Lib_PropertyHdl64);
             gid_File_Lib_PropertyHdl64,
             gid_File_Lib_Msvcp100,
             gid_File_Lib_Msvcr100,
             gid_File_Lib_Msvcp110,
             gid_File_Lib_Msvcr110);
End