1

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

我想要的是:一个发生在 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 命令应该足以连接这两个文件)。这应该可以实现我的目标。

想法?

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

4

3 回答 3

0

As to an exported function in .exe, its not a problem apparently, I tried this and it worked (compile with /FIXED:NO linker option, then copy the executable to 2.exe, then try running original executable and 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();

}

As to lzma, its even less of a problem, try looking at this http://nishi.dreamhosters.com/u/lzma.rar if the original source seems too complicated (lzmadec.c)

I don't quite understand the idea with attaching a zip file... do you mean a .zipx with lzma compression? Or maybe you actually need to look at zlib?

于 2011-02-17T22:54:53.323 回答
0

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

于 2011-02-17T21:43:43.590 回答
0

你可以看看NSIS如何创建 LZMA 自解压器。然后您可能可以使用 DLL 入口点来扩展它。

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

于 2011-02-17T21:53:09.523 回答