从msi文件里面导出文件

#include <Windows.h>
#include <Stdio.h>
#include <Tchar.h>
#include <Msi.h>
#include <Msiquery.h>
#pragma comment(lib, "Msi.lib")

BOOL WriteFileData(LPTSTR pszFilePath, LPVOID lpvData, DWORD cbData)
{
	BOOL			bRet;
	HANDLE			hFile;
	DWORD			dwRetLen;

	bRet = FALSE;

	hFile = CreateFile(pszFilePath,
		GENERIC_WRITE,
		0,
		NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if(hFile != INVALID_HANDLE_VALUE)
	{
		if(WriteFile(hFile, lpvData, cbData, &dwRetLen, NULL) && dwRetLen == cbData)
		{
			bRet = TRUE;
		}

		CloseHandle(hFile);
	}

	return bRet;
}

int _tmain(int argc, TCHAR *argv[])
{
	MSIHANDLE		hDatabase;
	MSIHANDLE		hView;
	MSIHANDLE		hRecord;
	TCHAR			sz[1024];
	DWORD			dw;
	LPSTR			lpStream;
	DWORD			dwStream;
	LPTSTR			pszDir;
	TCHAR			szPath[MAX_PATH];
	
	pszDir = _T("C:\\123");
	CreateDirectory(pszDir, NULL);
	if(MsiOpenDatabase(_T("C:\\123.msi"), MSIDBOPEN_DIRECT, &hDatabase) == ERROR_SUCCESS)
	{
		if(MsiDatabaseOpenView(hDatabase, _T("Select * From _Streams"), &hView) == ERROR_SUCCESS)
		{
			if(MsiViewExecute(hView, NULL) == ERROR_SUCCESS)
			{
				while(MsiViewFetch(hView, &hRecord) == ERROR_SUCCESS)
				{
					dw = 1024;
					MsiRecordGetString(hRecord, 1, sz, &dw);//第一列是流的标识

					dwStream = MsiRecordDataSize(hRecord, 2);//第二列是二进制数据
					lpStream = new CHAR[dwStream];
					MsiRecordReadStream(hRecord, 2, lpStream, &dwStream);//读取流

					lstrcpy(szPath, pszDir);
					lstrcat(szPath, _T("\\"));
					lstrcat(szPath, sz);
					WriteFileData(szPath, lpStream, dwStream);//写入数据

					delete []lpStream;
				}

				MsiViewClose(hView);
			}

			MsiCloseHandle(hView);
		}

		MsiCloseHandle(hDatabase);
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值