The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

INSTALLATION - Windows VC 8.0 details

Installation of the MQSeries module normnally requires the steps

  perl Makefile.PL
  make
  make test
  make install

However, if you are using Visual C++ 8.0 (Visual Studio 2005 or later), while your version of perl was built with an earlier release of Visual C++, you may need to perform additional tasks after the "make" step. The symptoms you'll see is that, when perl tries to load the MQSeries DLL, it cannot find the C runtime library, MSVCR80.dll.

Background

When you build an application or DLL with Microsoft VC 8.0 you require the C runtime library, MSVCR80.dll.

With previous releases of Visual C++ the corresponding DLL would either be added to the search path or installed in C:\windows\system32. Visual C++ 8.0 supports multiple versions of these libraries and no longer allows you to add them to the search path; instead, the libraries are installed in the Side-by-Side (SxS) directory and accessed by their UUID.

 dir C:\WINDOWS\WinSxS

 Volume in drive C has no label.

 Volume Serial Number is 64C5-B42B

 Directory of C:\WINDOWS\WinSxS

    11/01/2008  22:24    <DIR>          .
    11/01/2008  22:24    <DIR>          ..
    08/10/2007  19:23    <DIR>          InstallTemp
    11/01/2008  22:24    <DIR>          Manifests
    08/10/2007  18:49    <DIR>          Policies
    08/10/2007  18:49    <DIR> x86_Microsoft.VC80.ATL_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_6e805841
    10/10/2007  08:50    <DIR> x86_Microsoft.VC80.ATL_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_cbb27474
    08/10/2007  18:49    <DIR> x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
    10/10/2007  08:50    <DIR> x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
    08/10/2007  18:49    <DIR> x86_Microsoft.VC80.MFCLOC_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_3415f6d0
    10/10/2007  08:50    <DIR> x86_Microsoft.VC80.MFCLOC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_91481303
    08/10/2007  18:49    <DIR> x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_dec6ddd2
    10/10/2007  08:50    <DIR> x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_3bf8fa05

If you look in one of these directories, you'll see the DLL:

 dir C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd

 Volume in drive C has no label.
 Volume Serial Number is 64C5-B42B

 Directory of C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd

    08/10/2007  18:49    <DIR>          .
    08/10/2007  18:49    <DIR>          ..
    22/09/2005  22:48           479,232 msvcm80.dll
    22/09/2005  22:48           548,864 msvcp80.dll
    22/09/2005  22:48           626,688 msvcr80.dll

Making the MQSeries DLL work

Adding the relevant SxS directory to the search path won't help - the program loader will not load the MQSeries DLL. The only way to access the versioned MSVCR80.DLL is by creating a manifest file.

The manifest file must be called MQSeries.dll.manifest and have a content like the one below (you will have to adjust the UUID to match your system):

  <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
  <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
    <dependency>
      <dependentAssembly>
        <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
      </dependentAssembly>
    </dependency>
  </assembly>

We have had reports that the manifest file can be stored in the same directory as the perl binary or the same directory as the MQSeries DLL, but ideally it should be embedded into the MQSeries DLL.

This latter step is performed using mt.exe:

  http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx

Finally

These manifest issues only occur when both Visual C++ 8 and an earlier release are used to build different components of your system. If both perl and the MQSeries package are compiled with either Visual C++ 8 or an earlier release, you will not have any issue; but if perl itself is built using Visual C++ 7 and you try to build the MQSeries extension using Visual C++ 8, then you have to create the manifest file and embed it into MQSeries.dll using mt.exe.