如何在MSI文件中获取所有属性

时间:2019-07-16 10:15:44

标签: windows-installer

如何知道属性列表中包含MSI文件?

如果我们知道属性名称,则可以获取特定属性的属性值。我们可以使用以下代码:

WCHAR wzBuf[MAX_PATH+1]=L"";
DWORD dw=_countof(wzBuf);
    fGoodPath = ( ERROR_SUCCESS == ::MsiGetPropertyW(hInstall, L"INSTALLLOCATION", wzBuf, &dw) );

只是想知道我们如何知道MSI/MSP文件中定义的所有属性名称?

3 个答案:

答案 0 :(得分:0)

SDK文档 I would try these documented ones from the MSI SDK first

SDK来源 :SDK中还有一个 msi.h 头文件。就像您已经安装了Visual Studio一样,只需右键单击包含项,然后转到 "Open Document <msi.h>" 。您也可以在github.com(在这里和那里)找到它。尝试在 "INSTALLPROPERTY_PACKAGECODE" 中搜索 msi.h 或其他文档中的属性:

样本

#define INSTALLPROPERTY_PACKAGECODE           __TEXT("PackageCode")
#define INSTALLPROPERTY_VERSION               __TEXT("Version")
#if (_WIN32_MSI >=  110)
#define INSTALLPROPERTY_PRODUCTICON           __TEXT("ProductIcon")

...

等等...不确定这是否正是您要的吗?


链接

VBScript,内置的MSI属性from this old answer,VBScript可访问属性的列表:

ProductCodeLanguageProductNamePackageCodeTransformsAssignmentTypePackageNameInstalledProductNameVersionStringRegCompanyRegOwnerProductIDProductIconInstallLocationInstallSourceInstallDate,{ {1}},PublisherLocalPackageHelpLinkHelpTelephoneURLInfoAbout

答案 1 :(得分:0)

非常感谢大家。为了更清楚地纠正我的问题: 我想从MSP / MSI文件中获取补丁代码GUID。并且只能从查看“补丁代码”属性 MSP file。 但是,在像下面的代码一样使用MsiGetPropertyA()进行读取时,只需从结果中获取szPatchCode(null)和dwPCodeLen(0)。 因此,我想检查属性名称是否与上面的MSP文件屏幕快照中定义的名称相同。这就是为什么我想知道如何获取MSP文件中定义的所有属性的原因。然后可以检查预期的属性名称字符串。

LPSTR szPatchCode = NULL;
DWORD dwPCodeLen = 0;
MsiGetPropertyA(hInstall, "PATCHNEWPACKAGECODE", szPatchCode, &dwPCodeLen);

答案 2 :(得分:0)

Github.com :来自github.com的VBScript示例:PullMSPOfficeUpdates.vbs,建议进行检查。迭代补丁。 A "canned" github search

基本示例 :这是一个精简后的示例,可从MSP获取补丁代码。抱歉,没有C ++,但我太生锈了,没有足够的时间(也许添加您自己的答案并将其设置为C ++接受-提示:仅编辑当前的,更像是注释-更喜欢编辑原始内容回答或评论-只是这里通常使用的方法):

Const MSIOPENDATABASEMODE_PATCHFILE = 32
Const MSIPID_REVNUMBER = 7

Set installer = CreateObject("WindowsInstaller.Installer")
Set msp = installer.OpenDatabase("C:\MyPath.msp", MSIOPENDATABASEMODE_PATCHFILE)
Set summaryinfo = msp.SummaryInformation

MsgBox summaryinfo.Property(MSIPID_REVNUMBER)

更新:我不是C ++开发人员,但是with some help from Installshield's Michael Urman,我认为此C ++示例至少应与Visual Studio 2017一起使用。请不要对实际的C ++构造use github.com to find more samples过于挑剔(罐装搜索示例-将来只供他人和我本人使用,我知道您不需要它):

#include "pch.h"

#define WIN32_LEAN_AND_MEAN

#include <atlstr.h> // CString support from ATL
#include <Msiquery.h>

#pragma comment(lib, "msi.lib") // to allow linking

int main()
{
    CString lpszFilename = L"C:\\YourPatchFile.msp";

    PMSIHANDLE hSum;
    DWORD dwErr = MsiGetSummaryInformation(0, lpszFilename, 0, &hSum);
    if (ERROR_SUCCESS == dwErr)
    {
        UINT uiProperty = 7;
        UINT uiDataType = 0;
        INT iValue = 0;
        FILETIME ftValue = { 0 };
        CString sValue;
        DWORD cchValue = MAX_PATH;

        dwErr = MsiSummaryInfoGetProperty(hSum, uiProperty, &uiDataType, &iValue, &ftValue, (LPWSTR)sValue.GetString(), &cchValue);

        MessageBox(NULL, sValue, L"Patch Code:", MB_OK);
    }

   MsiCloseHandle(hSum);
   return 0;
}

测试 1) 在Visual Studio中创建新的C ++控制台项目, 2) 将上述代码粘贴到新项目的主“ ConsoleApplicationX.cpp”文件(其中X是数字)中-替换其中的所有内容, 3) 调整MSP文件的路径( CString lpszFilename = L"C:\\YourPatchFile.msp";), 4) 大声说:“在洞里开火”,并希望最好:-)。

MSI API文档 :以下是一些链接: