【问题标题】:Make Custom Self-Extractor制作自定义自解压器
【发布时间】:2011-02-17 21:08:17
【问题描述】:

我会解释我想要什么,然后我会解释我是如何努力实现它的。我想知道我是否以正确的方式解决这个问题,或者是否有更容易的事情。

我想要什么:发生在 ALSO 中的自解压可执行文件有一个额外的入口点(这使得可执行文件可以像 DLL 一样适当地使用)。附加入口点必须是压缩负载的一部分。奇怪的是,入口点不会执行任何 LZMA 函数(请不要问为什么……长篇大论)。仅供参考:使用 DLL 入口点制作可执行文件是一件小事——我已经知道该怎么做。

我如何实现这一目标:我已经下载了 LZMA SDK 并将构建我自己的 C++ 自解压器。似乎没有 LZMA API 文档。显然,如果我想学习如何使用 LZMA,我必须阅读 .\C\util\7z\7zmain.c 或 .\cpp\7zip\bundles\lzmaCon\lzmaAlone.cpp。不知道学习这些是不是最快的学习工具。

创建自解压代码后,我将添加所需的 DLL 入口点并进行构建。生成的 EXE 自解压器我将与一个 zip 文件连接(一个 DOS 命令应该足以连接这两个文件)。这应该可以实现我的目标。

想法?

附言顺便说一句,我在几年前已经完成了部分工作。我制作了一个自解压器(我认为是 C# 中的)可执行文件,然后我将其与一个 zip 文件(通过 DOS 命令)连接起来。瞧,出现了一个自解压的 zip 可执行文件。使我目前的工作与众不同的是,我现在使用的是 C++,并且我需要这个额外的/任意的 DLL 入口点。

【问题讨论】:

    标签: c++ sdk compression 7zip lzma


    【解决方案1】:

    为什么要把这两种功能混在一起呢?为什么不直接制作一个 dll 和一个使用它的可执行文件。

    【讨论】:

    • 我的最终结果必须是一个可执行文件,而不是一个可执行文件加上一个 DLL。
    【解决方案2】:

    您可以查看NSIS 如何创建 LZMA 自解压器。然后您可能可以使用 DLL 入口点对其进行扩展。

    或者您可以只使用 NSIS 脚本来生成自解压器并使用它们的脚本语言来创建 DLL 条目。

    【讨论】:

      【解决方案3】:

      对于.exe中的导出函数,显然不是问题, 我试过这个并且它有效(使用 /FIXED:NO 链接器选项编译, 然后将可执行文件复制到2.exe,然后尝试运行原始可执行文件和2.exe)

      #include <stdio.h>
      #include <windows.h>
      
      //#pragma comment(linker,"/FIXED:NO")
      
      extern "C"
      __declspec(dllexport)
      void __cdecl func( void ) {
        int a;
        __asm {
          call m0
          m0: pop a
        }
        printf( "dll func! @ %08X\n", a );
      }
      
      typedef void (*__cdecl pfunc)( void );
      
      int main( void ) {
      
        HMODULE h = LoadLibrary( "2.exe" );
        printf( "h=%08X\n", h );
      
        void* p = GetProcAddress( h, "func" );
        printf( "p=%08X\n", p );
      
        pfunc f = pfunc(p);
        f();
      
      }
      

      至于lzma,它的问题更小,如果原始来源似乎太复杂,请尝试查看http://nishi.dreamhosters.com/u/lzma.rar (lzmadec.c)

      我不太明白附加 zip 文件的想法...你的意思是 .zipx 用 lzma 压缩?或者也许你真的需要看看 zlib?

      【讨论】:

        猜你喜欢
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        • 2014-12-01
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多