如何使用 SetupAPI 的 SetupIterateCabinet() 函数(cab文件解压)

本文包含演示如何使用 SetupAPI 的 SetupIterateCabinet() 函数提取出一个 CAB 文件的文件的示例。 当您使用 SetupIterateCabinet() 时, 不需要的.inf 文件。

本示例查找名为 TestCab.cab CAB 文件。 您应将 TestCab.cab 放作为示例可执行文件在同一文件夹。 


注意: 不支持从 Windows 95 和 Windows 98 系统 cabinet 文件使用安装程序 API 中解压缩文件。 安装 API 将用于提取文件的 cabinet 文件应该是开发人员编写使用 CAB SDK (MakeCab.exe)。 在 Windows 95 下安装 API 未能从操作系统 CAB 压缩包,解压缩文件,但这不在 Windows 98 下起作用,这是设计使然。

它是永远不会用于 (或支持) 为开发人员从使用安装程序 API 的操作系统文件中提取文件。 受支持的方法是使用 Extract.exe。

示例代码

在 Visual C++ 版本 5.0 中, 创建一个新的控制台应用程序并添加下面的代码:
   #include <windows.h>    // Includes basic windows functionality.
#include <stdio.h>      // Includes the standard i/o functions.
#include <string.h>     // Includes the string functions.
#include <tchar.h>      // Includes the string functions.
#include <setupapi.h>   // Includes the SetupAPI.
// Link with SetupAPI.Lib.
#pragma comment (lib, "setupapi.lib")
#define CAB_FILE_NAME      TEXT("TestCab.Cab")
// Global variable holding destination directory.
TCHAR g_szTargetPath[MAX_PATH];
void IterateCabinet(PTSTR pszCabFile);
void main()
{
TCHAR szSourcePath[MAX_PATH];
TCHAR szInfFileName[MAX_PATH];
GetModuleFileName(NULL, szSourcePath, MAX_PATH);
// Strip setup.exe off path.
*(strrchr(szSourcePath, '\\') + 1) = '\0';
// Make the .exe directory the Target directory.
lstrcpy(g_szTargetPath, szSourcePath);
// Assume that CAB_FILE_NAME is in the .exe directory.
lstrcpy(szInfFileName, szSourcePath);
lstrcat(szInfFileName, CAB_FILE_NAME);
IterateCabinet(szInfFileName);
}
LRESULT
WINAPI
CabinetCallback ( IN PVOID pMyInstallData,
IN UINT Notification,
IN UINT Param1,
IN UINT Param2 )
{
LRESULT lRetVal = NO_ERROR;
TCHAR szTarget[MAX_PATH];
FILE_IN_CABINET_INFO *pInfo = NULL;
FILEPATHS *pFilePaths = NULL;
lstrcpy(szTarget,g_szTargetPath);
switch(Notification)
{
case SPFILENOTIFY_FILEINCABINET:
pInfo = (FILE_IN_CABINET_INFO *)Param1;
lstrcat(szTarget, pInfo->NameInCabinet);
lstrcpy(pInfo->FullTargetName, szTarget);
lRetVal = FILEOP_DOIT;  // Extract the file.
break;
case SPFILENOTIFY_FILEEXTRACTED:
pFilePaths = (FILEPATHS *)Param1;
printf ( "Extracted %s\n",pFilePaths->Target);
lRetVal = NO_ERROR;
break;
case SPFILENOTIFY_NEEDNEWCABINET: // Unexpected.
lRetVal = NO_ERROR;
break;
}
return lRetVal;
}
void IterateCabinet(PTSTR pszCabFile)
{
LPVOID lpMsgBuf;
if (  !SetupIterateCabinet(pszCabFile,
0, (PSP_FILE_CALLBACK)CabinetCallback, 0) )
{
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
GetLastError(), MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
MessageBox( NULL,(LPTSTR) lpMsgBuf,
"SetupIterateCabinet() Error :",
MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST);
}
}


 自:http://support.microsoft.com/kb/189085/zh-cn

posted on 2009-03-10 15:28  阿彪  阅读(1692)  评论(0编辑  收藏  举报

导航