获取Msi文件的属性内容

void MsiGetPropertyByOpenPackage()
{
	MSIHANDLE msiHandle = NULL;
	UINT uiOpenState;
	TCHAR* szMsiFileName= _T("C:\\Program Files (x86)\\远为软件\\virnos client\\SWar.msi");
	uiOpenState = MsiOpenPackage(szMsiFileName, &msiHandle);
	if (ERROR_SUCCESS != uiOpenState)
	{
		// error
		return;
	}

	TCHAR* szValueBuf = NULL;
	DWORD cchValueBuf = 0;
	UINT uiState =MsiGetProperty(msiHandle, TEXT("ProductName"), TEXT(""), &cchValueBuf);
	if (ERROR_MORE_DATA == uiState)
	{

		++cchValueBuf;
		szValueBuf = new TCHAR(cchValueBuf);
		if (szValueBuf)
		{
			uiState = MsiGetProperty(msiHandle, TEXT("ProductName"), szValueBuf, &cchValueBuf);
		}
	}
	MsiCloseHandle(msiHandle);
}
调用MsiOpenPackage函数来获取MSIHANDLE值,然后就可以获取属性值,MsiOpenPackage使用的时候会打开msi文件,会看到程序运行时的界面,再调用MsiCloseHandle(hInstall)函数就关闭msi文件,也会看到msi程序运行界面消失。
用该方法的时候就会看到有msi瞬间闪现安装界面,体验感觉不好


因此使用MsiOpenDatabase打开msi文件,然后再获取,后面相继使用MsiDatabaseOpenView,MsiViewExecute,MsiViewFetch,MsiRecordGetString等方法,

使用MsiCloseHandle关闭打开的msi句柄。



BOOL  GetMsiPropertyProductVersion(CString strMsiName, CString &strVer )
{
	USES_CONVERSION;
	MSIHANDLE hMsiHandle = NULL;
	UINT uiStatus = MsiOpenDatabase(strMsiName, MSIDBOPEN_READONLY, &hMsiHandle);
	if (ERROR_SUCCESS != uiStatus)
	{
		return FALSE;
	}
	MSIHANDLE hView = NULL;
	MsiDatabaseOpenView(hMsiHandle, _T("SELECT * FROM Property WHERE Property = 'ProductVersion'"), &hView);
	MSIHANDLE hRecord = NULL;
	MsiViewExecute(hView, hRecord);
	if (MsiViewFetch(hView, &hRecord) == ERROR_SUCCESS)
	{
		TCHAR szName[MAX_PATH]={0};
		TCHAR szValue[MAX_PATH]={0};
		DWORD  dwStringLen = MAX_PATH;
		MsiRecordGetString(hRecord, 1, szName, &dwStringLen);
		dwStringLen = MAX_PATH;
		MsiRecordGetString(hRecord, 2, szValue, &dwStringLen );
		printf("%s\t:%s\r\n", T2A(szName), T2A(szValue));
		strVer = szValue;
		MsiCloseHandle(hView);
		MsiCloseHandle(hMsiHandle);
		return TRUE;
	}
	MsiCloseHandle(hView);
	MsiCloseHandle(hMsiHandle);
	return FALSE;
}

UINT  GetMsiAllProperty(CString strMsiName )
{
	USES_CONVERSION;
	MSIHANDLE hMsiHandle = NULL;
	UINT uiStatus = MsiOpenDatabase(strMsiName, MSIDBOPEN_READONLY, &hMsiHandle);
	if (ERROR_SUCCESS != uiStatus)
	{
		return uiStatus;
	}


	MSIHANDLE hView = NULL;
	MsiDatabaseOpenView(hMsiHandle, _T("SELECT * FROM Property"), &hView);
	MSIHANDLE hRecord = NULL;
	MsiViewExecute(hView, hRecord);
	while(MsiViewFetch(hView, &hRecord) == ERROR_SUCCESS)
	{
		TCHAR szValueBuf[MAX_PATH]={0};
		TCHAR Source[MAX_PATH]={0};
		DWORD  dwStringLen = MAX_PATH;
		MsiRecordGetString(hRecord, 1, szValueBuf, &dwStringLen);
		dwStringLen = MAX_PATH;
		MsiRecordGetString(hRecord, 2, Source, &dwStringLen );
		printf("%s\t:%s\r\n", T2A(szValueBuf), T2A(Source));
	}
	MsiCloseHandle(hView);
	MsiCloseHandle(hMsiHandle);
	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零点零一

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值