Delphi CAB文件API澄清

Delphi CAB文件API澄清,delphi,winapi,cab,Delphi,Winapi,Cab,由于我在任何地方都没有看到任何内容不指向有关此问题的原始Microsoft文档,或者源代码似乎无法回答我的问题,因此我想我可能会在这里问一些问题。(Delphi标签就在那里,因为这就是我的开发环境在代码中的位置) 也就是说,我有一些API文档没有回答的问题。第一个:fdi_通知消息。“我的责任”在于编码这些文件:fdintCABINET\u信息:fdintPARTIAL\u文件:fdintNEXT\u CABINET:fdintENUMERATE:?我将用一个例子来说明我的意思。对于fdintC

由于我在任何地方都没有看到任何内容不指向有关此问题的原始Microsoft文档,或者源代码似乎无法回答我的问题,因此我想我可能会在这里问一些问题。(Delphi标签就在那里,因为这就是我的开发环境在代码中的位置)

也就是说,我有一些API文档没有回答的问题。第一个:fdi_通知消息。“我的责任”在于编码这些文件:
fdintCABINET\u信息:fdintPARTIAL\u文件:fdintNEXT\u CABINET:fdintENUMERATE:
?我将用一个例子来说明我的意思。对于
fdintCLOSE\u FILE\u INFO
,“我的责任”是关闭与给定句柄相关的文件,并根据fdi\u notify中传递的数据设置文件的日期和时间


我想我遗漏了一些东西,因为我的代码没有处理提取跨越的CAB文件……关于如何做,有什么想法吗?

您很可能遇到的是,FDICopy只读取您传入的CAB。它将使用
fdintNEXT_CABINET
为响应
fdintCOPY_FILE
而提取的任何文件获取跨距数据,但它仅为第一个cab上开始的文件调用
fdintCOPY_FILE

要获取整个集合的目录列表,需要在循环中调用FDICopy。每次收到
fdintCABINET\u INFO
事件时,保存
psz1
参数(下一个驾驶室名称)。当FDICopy返回时,请检查该选项。如果它是一个空字符串,则完成操作,如果没有,则再次调用FDICopy,并将下一个cab作为新路径


fdintCABINET\u INFO:唯一的责任是返回0以继续处理。您可以使用提供的信息(下一个文件柜的路径、下一个磁盘、路径名、nad set ID),但不需要

fdintPARTIAL\u文件:根据您处理CAB的方式,您可能可以忽略这一点。您将只在一组中的第二个和更高版本的图像中看到它,它告诉您特定的条目是从以前的cab继续的。如果从集合中的第一个cab开始,您将已经看到该文件的
fdintCOPY\u文件
。如果您正在处理random.cabs,那么您也不能真正使用它,因为您没有要提取的文件的开头

fdintNEXT\u CABINET:您可以使用此命令提示用户为下一个CABINET输入新目录,但对于简单的扩展支持,如果传入的文件名有效,则返回0;如果无效,则返回-1。如果返回0且cab无效,或者是错误的cab,则将再次调用该cab。最简单的方法(如果您不请求新的磁盘/目录)就是选中
pfdin^.fdie
。如果它是FDIError\u None则等于第一次为请求的cab调用它,因此您可以返回0。如果是其他内容,它已经尝试打开请求的cab至少一次,因此您可以返回-1作为错误


fdintENUMERATE:我想你可以忽略这一点。文档中没有介绍它,我看过的两个cab库也没有使用它。它可能是以前API版本的遗留问题。

您很可能遇到的是,FDICopy只读取您传入的cab。它将使用
fdintNEXT_CABINET
为响应
fdintCOPY_FILE
而提取的任何文件获取跨距数据,但它仅为第一个cab上开始的文件调用
fdintCOPY_FILE

要获取整个集合的目录列表,需要在循环中调用FDICopy。每次收到
fdintCABINET\u INFO
事件时,保存
psz1
参数(下一个驾驶室名称)。当FDICopy返回时,请检查该选项。如果它是一个空字符串,则完成操作,如果没有,则再次调用FDICopy,并将下一个cab作为新路径


fdintCABINET\u INFO:唯一的责任是返回0以继续处理。您可以使用提供的信息(下一个文件柜的路径、下一个磁盘、路径名、nad set ID),但不需要

fdintPARTIAL\u文件:根据您处理CAB的方式,您可能可以忽略这一点。您将只在一组中的第二个和更高版本的图像中看到它,它告诉您特定的条目是从以前的cab继续的。如果从集合中的第一个cab开始,您将已经看到该文件的
fdintCOPY\u文件
。如果您正在处理random.cabs,那么您也不能真正使用它,因为您没有要提取的文件的开头

fdintNEXT\u CABINET:您可以使用此命令提示用户为下一个CABINET输入新目录,但对于简单的扩展支持,如果传入的文件名有效,则返回0;如果无效,则返回-1。如果返回0且cab无效,或者是错误的cab,则将再次调用该cab。最简单的方法(如果您不请求新的磁盘/目录)就是选中
pfdin^.fdie
。如果它是FDIError\u None则等于第一次为请求的cab调用它,因此您可以返回0。如果是其他内容,它已经尝试打开请求的cab至少一次,因此您可以返回-1作为错误


fdintENUMERATE:我想你可以忽略这一点。文档中没有介绍它,我看过的两个cab库也没有使用它。这可能是以前API版本的遗留问题。

您需要链接到一些背景信息,以便我们这些不知道您在说什么的人能够快速了解情况。如果您试图解压缩CAB文件,则有一个开源替代方案:该库根据LGPL条款获得许可,可以用于商业应用程序。我不确定这里的问题是什么。你的例子很清楚:当你收到