#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;
}
从msi文件里面导出文件
最新推荐文章于 2019-09-14 10:43:31 发布