返回首页

{A}简介
我们大多数人必须使用应用程序安装的计划,首先提取从自身的整体设置,然后开始安装过程。例如,Mozilla Firefox的安装文件只有一个文件中提取所有的设置,然后开始安装过程。
此应用程序还创建了一个自解压压缩的二进制。一旦建立后,这些二进制文件并不需要任何安装,并可以提取所有被压缩的文件内。背景
应用程序试图证明下列事项:创建一个自解压二进制文件。演示使用一些常见的Qt跨平台的GUI彗星库控制。使用Qt移植到其他操作系统的应用程序一个蛋糕走。有关图书馆的信息可以在这里找到:{A2}。使用内存中的数据压缩,Zlib库。使用Blowfish加密算法加密的密码。使用代码
这是一个非常小的代码,只有三个班。cselfextractor类从QDialog的类继承,并实现了应用程序界面。cAbout类是一个非常小的类,并继承了QDialog的显示应用程序的关于对话框。cBinExt类实现创建的二进制文件从二进制中提取数据的逻辑。
要使用的代码,并编译它,应该在系统上安装的Qt。如果你是新的Qt,只需打开从Qt的pro文件和编译代码。这很容易。
了解cselfextractor类是很容易的,如果你已经做了一些C编程。 Qt使用事件处理信号和槽。信号,如按钮单击或按键等事件,在VC或任何基于GUI库。插槽处理这些事件的功能,。这些声明在头文件中。cpp文件中实现。

QObject::connect(m_btnAddFiles, SIGNAL(clicked()),this, SLOT(AddFiles()));

在这里,点击按钮m_btnAddFiles,将调用AddFiles的函数。即使在此功能,您可以把您的实现。{C}
是一个cselfextractor类cBinExt指针。 cBinExt类提供了一些常用功能,因此,可以在用户选择使用QDialog的数据进行压缩或提取。用户选择的文件,所有这些文件压缩发送到cBinExt类。
让我们来谈谈这一切是如何完成。如何创建一个自解压二进制是不破坏原始的二进制地址。大多数经验的程序员会知道这一点。如果我们有一个应用程序(不一定是一个C应用程序),也有一切的二进制地址,像等功能,如果我们写什么,将打破地址的二进制二进制可能无法运行。
但是,如果我们写的二进制的东西,什么都不会休息,一切都将照常运行,和二进制不知道的东西是在年底追加。这是创建一个自解压二进制文件,我用的背后的想法。
让我们开始与这是不正常的二进制压缩。
m_BinExt = new cBinExt;



if(m_BinExt->IsAttachmentPresent() == SUCCESS)

{

      m_AmICompressed = true;

}

注意:如果你在看代码,你会发现,所有的try - catch评论。这是因为我有编译Qt的使用静态开关将- fno -例外,这样我可以分发我的应用程序没有任何依赖的DLL或。SOS。这就是为什么你会发现,二进制的大小大约是8 MB。所有的Qt代码静态链接。
理解上面的代码之前,我将讨论的二元结构。从这里出发:
File Structure (will help if we start from end):

         _______________

        |Executable data|

        |_______________|

        |Embeded file(s)|

        |_______________|___________________________________

        |encrypted keys, size = 2 * sizeof(unsigned long)   |

        |___________________________________________________|

        |Index telling the size and |

        |name of embeded file       |

        |This section will be 100kb |

        |___________________________|

        |Index structure            |

        |*IDX*\n                    |

        |FileName_1 \t size \n      |

        |FileName_2 \t size \n      |

        |FileName_n \t size \n      |

        |*EIDX*\n                   |

        |___________________________|

当我运行正常的应用程序,它只有第一部分结构如上图所示,即,可执行数据。
现在,用户选择使用GUI的一些文件,并给出了一个密码。当用户按下存档按钮时,采取以下步骤:由用户提供的应用程序创建一个文件在指定的路径。打开并读取自己写入到输出文件中。将列表中的每个打开文件,读取它们,压缩他们在内存使用Zlib压缩,并写入到输出文件。更新索引结构。当所有的文件数据被追加到输出文件,加密的密码。加密给两个键。这是8个字​​节的长度。他们写入到输出。编写的密码键后,写索引结构。我已考虑其长度为100 KB。
所以,压缩文件具有以下结构。文件的开头是原始应用程序相同的,所以它可以执行没有任何问题。现在,让我们重温行:
if(m_BinExt->IsAttachmentPresent() == SUCCESS)

{

      m_AmICompressed = true;

}

IsAttachmentPresent功能将尝试找到任何二进制索引结构。如果它发现的结构,这意味着它是一个压缩的二进制和应用程序将尝试提取数据。如果没有发现任何结构,这意味着它的原始应用程序,并尝试压缩数据。 m_AmICompressed是相应的设置。
现在你可以看到,如果二进制压缩,它调用提取功能。如果二进制文件没有压缩,它调用的压缩功能。
另外,我这个指针发送cBinExt类。这是因为作为类的进步,它需要更新进度条。通过公开的功能,它可以更新进度条。
让我们的讨论cBinExt类。类主要有三个重要的功能:它告诉如果是一个压缩的二进制或。正如上面所讨论的文件压缩。一个提取里面的二进制文件已经。
提取是在cBinExt:ExtractFiles()函数。该计划从年底开始,首先读取索引。 ReadIndexFromBinary()这项工作,并返回与大小的文件列表。大小发送数据时使用的zlib的压缩功能。解压缩后,所有的数据写入到文件中。所有文件都提取出来。
减压只occures密码时,在二进制中存储的密码键匹配。 ReadEncryptionKeys()函数读取加密密钥。所提供的密码是加密和密钥生成与存储的密钥相匹配。如果它们匹配,这是一个有效的密码。历史
是应用程序的第一个版本。应用程序无法压缩文件夹。应用程序的未来版本将支持的压缩文件夹。此外,应用程序可以失败,如果一个文件是非常大的单块的内存无法分配压缩的。这需要得到照顾。

回答

评论会员:Nagarajanp 时间:2012/01/25
我喜欢使用到Silverlight。请帮我
评论会员:PIEBALDconsult 时间:2012/01/25
我不知道,我知道什么有关Silverlight