我会解释我想要的东西,然后我将解释我是如何努力实现它的。我想知道我是否正确地对待这个问题,或者是否有更容易的事情。
我想要的是什么:一个自解压的可执行文件也会有一个额外的入口点(这使得可执行文件可以像DLL一样使用)。附加入口点必须不是压缩有效负载的一部分。奇怪的是,切入点不会执行任何LZMA功能(请不要问为什么......长篇故事)。仅供参考:使用DLL入口点制作可执行文件是一件小事 - 我已经知道如何做到这一点。
我是如何追求这个:我已经下载了LZMA SDK并将构建我自己的C ++自提取器。似乎没有LZMA API文档。显然,如果我想学习如何使用LZMA,我必须阅读。\ C \ util \ 7z \ 7zmain.c或。\ cpp \ 7zip \ bundles \ lzmaCon \ lzmaAlone.cpp。我不知道研究这些是否是最快的学习工具。
一旦我创建了自解压代码,那么我将添加我需要的DLL入口点并构建。生成的EXE自提取器我将与一个zip文件连接(一个DOS命令应该足以连接这两个文件)。这应该达到我的目标。
思想?
P.S。顺便说一句,这部分年前我已经部分完成了。我创建了一个自我提取器(我认为是C#)可执行文件,然后我用一个zip文件(通过DOS命令)连接起来。 Voila,一个自解压缩的zip可执行文件出现了。是什么让我目前的努力与众不同,现在我正在使用C ++,我需要这个额外的/任意的DLL入口点。
答案 0 :(得分:0)
为什么要将两种功能结合在一起?你为什么不制作一个dll和一个使用它的可执行文件。
答案 1 :(得分:0)
您可以查看NSIS如何创建LZMA自动提取器。然后你可以使用DLL入口点扩展它。
或许您可以使用NSIS脚本生成自解压程序并使用其脚本语言来创建DLL条目。
答案 2 :(得分:0)
对于.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?