中易网

如何在VC中实现解压.cab文件

答案:1  悬赏:10  
解决时间 2021-01-19 23:46
如何在VC中实现解压.cab文件
最佳答案
C++实现CAB压缩解压文件 示例参考
// This is an ID which is written (invisible) into the CAB file
UINT u32_CabID = 12345;
// Store filetimes as UTC in CAB files
BOOL b_StoreUtcTime = TRUE;
// Change this to split the archive into multiple files (200000 --> CAB split size = 200kB)
// ATTENTION: In this case Parameter 1 of CreateFCIContext MUST contain "%d"
UINT u32_SplitSize = 0x7FFFFFFF;
// You can specify your own key for CAB encryption here (the longer the more secure, up to 5000 characters)
// Set empty EncryptionKey ("") to get a CAB file without encryption
char* s8_EncryptionKey = "";
//char* s8_EncryptionKey = "AH%KJ/76?KJ逪谋\狞dghf7(ZTbjasdf82iz// ########################## Initialization ############################
char s8_WinDir[MAX_PATH];
GetWindowsDirectoryA(s8_WinDir, sizeof(s8_WinDir));
char s8_Explorer[MAX_PATH];
char s8_Notepad [MAX_PATH];
sprintf(s8_Explorer, "%s\\Explorer.exe", s8_WinDir);
sprintf(s8_Notepad, "%s\\Notepad.exe", s8_WinDir);
char s8_WorkDir[MAX_PATH];
GetCurrentDirectoryA(sizeof(s8_WorkDir), s8_WorkDir);
char s8_CompressDir[MAX_PATH];
char s8_DecryptDir [MAX_PATH];
char s8_ExtractDir [MAX_PATH];
sprintf(s8_CompressDir, "%s\\_Compressed", s8_WorkDir);
sprintf(s8_DecryptDir, "%s\\_Decrypted", s8_WorkDir);
sprintf(s8_ExtractDir, "%s\\_Extracted", s8_WorkDir);
char s8_CompressFile[MAX_PATH];
strcpy(s8_CompressFile, s8_CompressDir);
strcat(s8_CompressFile, "\\Packed_%d.cab");
Cabinet::CCompress i_Compress;
Cabinet::CExtract i_ExtrDecrypt;
Cabinet::CExtractResource i_ExtrResource;
i_Compress. SetEncryptionKeyA(s8_EncryptionKey);
i_ExtrDecrypt.SetDecryptionKeyA(s8_EncryptionKey);
#ifdef UNICODE
printf("UNICODE compiled\n");
#else
printf("MBCS compiled\n");
#endif
// ########################## Compress demo ############################
// This will pack Explorer.exe and Notepad.exe into a CAB file with subfolders
printf("\n CAB FILE COMPRESSION\n\n");
if (!i_Compress.CreateFCIContextA(s8_CompressFile, b_StoreUtcTime, u32_SplitSize, u32_CabID))
{
printf("Compress ERROR: Could not create FCI context:\n%s\n", i_Compress.LastErrorA());
goto _RESOURCE;
}
if (!i_Compress.AddFileA(s8_Explorer, "FileManager\\Explorer.exe", 0))
{
printf("Compress ERROR: Could not add Explorer.exe to cabinet:\n%s\n", i_Compress.LastErrorA());
goto _RESOURCE;
}
if (!i_Compress.AddFileA(s8_Notepad, "TextManager\\Notepad.exe", 0))
{
printf("Compress ERROR: Could not add Notepad.exe to cabinet:\n%s\n", i_Compress.LastErrorA());
goto _RESOURCE;
}
if (!i_Compress.FlushCabinet(FALSE))
{
printf("Compress ERROR: Could not flush Cabinet:\n%s\n", i_Compress.LastErrorA());
goto _RESOURCE;
}
printf("SUCCESS: Compressed Explorer.exe and Notepad.exe into cabinet in\n\"%s\"\n", s8_CompressDir);
// ########################## Decrypt demo ############################
// This will decrypt the CAB file which was encrypted above
if (!s8_EncryptionKey[0]) // Skip the following if the file was not encrypted
goto _RESOURCE;
printf("\n----------------------------------------------------------------\n");
printf("\n CAB FILE DECRYPTION\n\n");
if (!i_ExtrDecrypt.CreateFDIContext())
{
printf("Decrypt ERROR: Could not create FDI context:\n%s\n", i_ExtrDecrypt.LastErrorA());
goto _RESOURCE;
}
// replace "%d" -> "1"
sprintf(s8_CompressFile, s8_CompressFile, 1);
// Now extract into subdirectory "_Decrypted" and the corresponding subdirectories in the CAB file
if (!i_ExtrDecrypt.ExtractFileA(s8_CompressFile, s8_DecryptDir))
{
printf("Decrypt ERROR: Not all files could be extracted:\n%s\n", i_ExtrDecrypt.LastErrorA());
goto _RESOURCE;
}
printf("SUCCESS: Decrypted all files from the above encrypted cabinet into\n\"%s\"\n", s8_DecryptDir);
// ########################## Extract resource demo ############################
// This will extract the file "Test.cab" in the embedded resources into a directory
_RESOURCE:
printf("\n----------------------------------------------------------------\n");
printf("\n CAB RESOURCE EXTRACTION\n\n");
if (!i_ExtrResource.CreateFDIContext())
{
printf("Extract ERROR: Could not create FDI context:\n%s\n", i_ExtrResource.LastErrorA());
goto _WAIT;
}

printf("SUCCESS: Extracted all files from cabinet resource Test.cab into\n\"%s\"\n", s8_ExtractDir);
_WAIT:
// Under some cirumstances the DOS window disappears immediately, so you cannot read anything!
printf("\n\nHit any key to exit\n");
getch();
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
五元素ifive 2平板电脑怎么开不了机了啊?开
谁能说说水浴锅内循环和外循环有什么区别,各
怀孕55天,胚芽15mm小不小
喝蜂蜜水的4大禁忌
蓝光之夜2015 节目单
鸡和猴属相相配吗?
请教各位哥哥姐姐弟弟妹妹你们认为做一家专卖
从海员在线找工作还要交钱吗
ipsa的护肤品好么?Ipsa有去角质的产品么?
丙寅年庚寅月甲午日辛未时,男虎!请您帮我看
晚风吹过青青湖畔到我耳边是什么歌,什么歌曲
现在热带风暴周四或周二的门票是多少啊?拜托
汽油浇到土里怎么清理
魔兽世界,这个是什么意思
互助村地址好找么,我有些事要过去
推荐资讯
长虹液晶itv42820f怎么进总线
在家庭里发生的事情
有晴字和乔字的诗词
看风水家中摆放石桌
定制门不合格 怎么办
一头尖一头圆可以用什么成语来形容
香港时代广场该怎么去呢?有什么公共交通可乘
坐完飞机可以补开发票吗?
450千米比九米求比值
君臣佐使是什么意思
200度的近视在对数视力表上多少看不清。还有3
朱哥是谁?好像知道..
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?