【发布时间】:2019-09-18 00:14:37
【问题描述】:
这听起来可能跑题了,但请多多包涵,因为我认为它的核心是一个编程问题。
我有一个非常旧的应用程序的安装程序,我需要在我的 Windows 8.1 PC 上安装它。安装程序会检查 Visual C++ 2005 SP 1,如果没有,它会提示您安装它,并重定向您下载它,但下载页面重定向到 Microsoft 404。
我安装了 VC++ 2005 SP 1,同时安装了 x86 和 x64。
所以,我使用 JustDecompile 反编译了安装程序,安装程序在 WinForms 中,并使用下面的代码检查 VC++ 2005 SP 1。
基本上,如果这行代码是真的,它会显示一条消息,您需要获取 VC++。
if (Form1.MsiQueryProductState("{7299052B-02A4-4627-81F2-1818DA5D550D}") != 5)
我已经阅读过它,这是在恐龙时代检查 VC++ 2005 的一种可接受的方法,但我相信上面作为产品代码的 GUID 对于 Win 8.1 不再准确,因为我得到了VC++ 2005 SP 1 直接来自 Microsoft,但仍未找到。
现在,我想弄清楚如何解决这个问题。有谁知道MsiQueryProductState 方法如何确定您是否为给定的产品代码安装了某些东西?它是否在某个地方的注册表中查找?如果是这样,我也许可以通过在注册表中伪造它来解决这个问题。
任何其他建议表示赞赏!
编辑以回答来自 cmets 的问题
从我反编译这个安装程序时可以看出,它是一个自定义的 WinForms 应用程序。这是一个EXE,而不是一个MSI。它有一个名为 Form1 的表单,其中显示了您可以安装的产品列表。您选择您想要的产品并单击“安装”按钮,然后单击“安装”按钮会调用一个首先检查 VC++ 的方法。
它使用以下代码检查 VC++,其中包含 VC++ 的硬编码产品代码。如果 MsiQueryProductStatus 的返回值 != 5,那么它会提示你必须安装 VC++,并且不会让你继续。
Form1.MsiQueryProductState("{7299052B-02A4-4627-81F2-1818DA5D550D}") != 5
Form1 是如何定义 MsiQueryProductState 的。
[DllImport("msi.dll", CharSet=CharSet.None, ExactSpelling=false)]
private static extern int MsiQueryProductState(string szProduct);
所以我需要弄清楚如何在安装了产品代码 7299052B-02A4-4627-81F2-1818DA5D550D 的情况下获得 VC++,或者我需要弄清楚如何欺骗 MsiQueryProductState 让我认为我拥有带有该产品代码的 VC++已安装。
【问题讨论】:
-
旧安装程序是 MSI 安装程序文件吗?或者它是一个setup.exe? MSI 文件很容易调整以避免该问题。应用名称? MsiQueryProductState 从 Windows Installer 数据库中检索信息,该数据库存储在注册表中的各个位置。您不应该直接读取 Windows Installer 数据库注册表项,而应通过解释这些项的 API 来避免依赖于实现细节(而不是适当的接口)。
-
在出发之前,让我再添加一个指向VS Runtime 2010 question 的链接。也许可以略读一下,看看你是否得到了一些进一步的指示。当您提供更多详细信息时会跟进。
-
安装程序是一个自定义的 WinForms 应用程序,我可以通过反编译来判断它。我将编辑问题以包含更多详细信息。
-
您是想为未来和其他人制作安装程序,还是只是为了安装它? Extracting MSI files?
-
我主要只是想安装它,并了解如何在 Win 8.1 上安装它,以便我可以写下未来的说明。我也主要是真的想提高自己对 MsiQueryProductState 功能的工作原理的了解。对迟到的回复表示歉意,我认为您在第二条评论中提供的链接可能对了解如何更改注册表以使其看起来像安装了此特定产品代码非常有帮助。
标签: c# .net windows-installer visual-c++-2005