http://bugs.winehq.org/show_bug.cgi?id=58578
Bug ID: 58578 Summary: Hygeia Pharmacy: complains that Microsoft ReportViewer is not installed (unimplemented MsiProvideAssemblyW() ?) Product: Wine Version: 10.12 Hardware: x86-64 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: -unknown Assignee: wine-bugs@winehq.org Reporter: peathot@hotmail.com Distribution: ---
Created attachment 79093 --> http://bugs.winehq.org/attachment.cgi?id=79093 Terminal output of Hygeia Pharmacy running under Wine
Hygeia Pharmacy is a .NET 4 application for pharmacy retail. When the application starts up, it will check for various shared components, ending up complaining that Microsoft Report Viewer has to be installed despite already installed.
Attached is the screenshot of the error. It says, "It's necessary to install an additional programed named Microsoft Report Viewer" ("มีความจำเป็นต้องติดตั้งโปรแกรมเสริมที่ชื่อว่า Microsoft Report Viewer").
Terminal output reveals 2 interesting FIXME's:
``` 0174:fixme:msi:MsiProvideAssemblyW L"Microsoft.ReportViewer.Common, Version=10.0 .0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MS IL", L"C:\Program Files\HygeiaPharmacy\HygeiaPharmacy.exe.config", 0, 0, 10D7 A618, 10D7A614 0174:fixme:msi:MsiProvideAssemblyW L"Microsoft.ReportViewer.Common, Version=10.0 .0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MS IL", (null), 0, 0, 10D7A618, 10D7A614 ```
This leads me to believe that the application chokes up because it does not receive the correct path to this .NET assembly, part of MS ReportViewer 2010.
---
Looking into multiple documents and into Wine itself, I _think_ it would be relatively simple to implement MsiProvideAssembly[A|W]() using facilities already implemented in Wine. Bug 58577 plays an important role on this.
I actually would love to get my hands dirty, if not for 2 problems:
1. I don't actually have much time myself. 2. Many years ago, I disassembled a different component of Windows (related to MDM/management policy) in order to debug my graduating project. I forgot everything by now, and it's IMHO not related, but combined with 1. I think it's probably better to stay safe.
(Can I explain some high-level idea? Will I run afoul of 2.?)
A number of MSDN documents that might be useful:
https://learn.microsoft.com/en-us/windows/win32/api/msi/nf-msi-msiprovideass... https://learn.microsoft.com/en-us/windows/win32/msi/assembly-registry-keys-w...
Also helpful is a small test program I write myself to exercise MsiProvideAssemblyW() in the same way as the application (and in a slightly different way). On Windows 11, this outputs as follow:
``` MsiProvideAssemblyW("Microsoft.ReportViewer.Common, ..." (qualified)) returns 0 Returned path (119): C:\WINDOWS\assembly\GAC_MSIL\Microsoft.ReportViewer.Common\10.0.0.0__b03f5f7f11d50a3a\Microsoft.ReportViewer.Common.dll MsiProvideAssemblyW("Microsoft.ReportViewer.Common" (unqualified)) returns 0 Returned path (119): C:\WINDOWS\assembly\GAC_MSIL\Microsoft.ReportViewer.Common\10.0.0.0__b03f5f7f11d50a3a\Microsoft.ReportViewer.Common.dll ```
On Wine, it outputs (excluding Wine's output itself):
``` MsiProvideAssemblyW("Microsoft.ReportViewer.Common, ..." (qualified)) returns 120 MsiProvideAssemblyW("Microsoft.ReportViewer.Common" (unqualified)) returns 120 ```
---
Following is the way I run Hygeia Pharmacy.
Hygeia Pharmacy is a relatively complex application and requires the full .NET installation (Mono is not enough). The following commands recreate the environment from scratch:
``` export WINEARCH=win32 export WINEPREFIX=/a/new/prefix
winetricks dotnet48 jet40 mdac28
wine ReportViewer.exe # sha256sum: e8ff182e202b321ac2b9245ee20c4eb659008ffb2a34cdbd3486f9da3d4c3e06 wine hygeia_trial_install.2.6.28.1.exe # sha256sum: 380085defb0af240f144d603da70d09a76c940a27a65953a9fbe3668c321b4e2
wine "C:\\users\\Public\\Desktop\\Hygeia Pharmacy.lnk" &>hygeia_pharmacy_wine_output.txt ```
---
The (trial) version can be obtained from https://www.hygeia-pharmacy.com/trial/. However, it requires a (free) registration, and the website is entirely in Thai with no English version.
In order to (try to) help you with the registration, the registration page at https://www.hygeia-pharmacy.com/register/ requires the followed:
1. A chosen username ("Hygeia ID") 2. A chosen password. 3. Your full name 4. Your email. 5. A math captcha (input the equation's answer).
I can't remember if there's an email verification after that step or not, because it's been a long time since I registered myself.
Once logged in, https://www.hygeia-pharmacy.com/trial/ will show a big blue button for downloading the trial version. The same page will also be a smaller link for "MS Report Viewer" which is hosted by Hygeia Pharmacy themselves (if you prefer an MS link, see the end of bug 58577).
http://bugs.winehq.org/show_bug.cgi?id=58578
--- Comment #1 from Ratchanan Srirattanamet peathot@hotmail.com --- Created attachment 79094 --> http://bugs.winehq.org/attachment.cgi?id=79094 Screenshot of the error
The full translation is:
It's necessary to install an additional programed named Microsoft Report Viewer. Click [Downloading and installation method]
(The button links to a help page on Hygeia Pharmacy website)
http://bugs.winehq.org/show_bug.cgi?id=58578
--- Comment #2 from Ratchanan Srirattanamet peathot@hotmail.com --- Created attachment 79095 --> http://bugs.winehq.org/attachment.cgi?id=79095 A small test program exercising MsiProvideAssemblyW()
http://bugs.winehq.org/show_bug.cgi?id=58578
--- Comment #3 from Ratchanan Srirattanamet peathot@hotmail.com --- Created attachment 79096 --> http://bugs.winehq.org/attachment.cgi?id=79096 A small test program exercising MsiProvideAssemblyW() (compiled with MSVC)
http://bugs.winehq.org/show_bug.cgi?id=58578
--- Comment #4 from Ratchanan Srirattanamet peathot@hotmail.com --- Oh, and if the component (MS Report Viewer) is not installed on the computer, the test program should print:
``` MsiProvideAssemblyW("Microsoft.ReportViewer.Common, ..." (qualified)) returns 1607 MsiProvideAssemblyW("Microsoft.ReportViewer.Common" (unqualified)) returns 1607 ```
http://bugs.winehq.org/show_bug.cgi?id=58578
--- Comment #5 from Ratchanan Srirattanamet peathot@hotmail.com --- I'm now trying to write a conformance test for MsiProvideAssembly[A|W](). This involves mocking assembly installation into Windows Installer's registry. I look into dlls/msi/tests and see that some tests mock installation by actually creating a .msi file and install it, while others directly set the registry. How are the methods chosen? What are advantages and disadvantages to these methods?