如何知道属性列表中包含MSI文件?
如果我们知道属性名称,则可以获取特定属性的属性值。我们可以使用以下代码:
WCHAR wzBuf[MAX_PATH+1]=L"";
DWORD dw=_countof(wzBuf);
fGoodPath = ( ERROR_SUCCESS == ::MsiGetPropertyW(hInstall, L"INSTALLLOCATION", wzBuf, &dw) );
只是想知道我们如何知道MSI/MSP
文件中定义的所有属性名称?
答案 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可访问属性的列表:
ProductCode
,Language
,ProductName
,PackageCode
,Transforms
,AssignmentType
,PackageName
,InstalledProductName
,VersionString
,RegCompany
,RegOwner
,ProductID
,ProductIcon
,InstallLocation
,InstallSource
,InstallDate
,{ {1}},Publisher
,LocalPackage
,HelpLink
,HelpTelephone
,URLInfoAbout
答案 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文档 :以下是一些链接: