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 ファイルと連結します (2 つのファイルを連結するには、DOS コマンドで十分です)。これは私の目標を達成するはずです。

考え?

ps ちなみに、私はこの数年前に部分的にやったことがあります。自己解凍プログラム (C# だと思います) を実行可能にし、それを (DOS コマンドを介して) zip ファイルと連結しました。出来上がり、自己解凍型の zip 実行可能ファイルが登場しました。私の現在の取り組みが異なるのは、現在 C++ を使用しており、この追加の任意の DLL エントリ ポイントが必要であることです。

4

3 に答える 3

0

なぜ2種類の機能を一緒に妨害するのですか?dllとそれを使用する実行可能ファイルを作成してみませんか。

于 2011-02-17T21:43:43.590 に答える
0

.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ファイルを添付するという考えがよくわかりません...lzma圧縮の.zipxを意味しますか? それとも、実際にzlibを見る必要があるのでしょうか?

于 2011-02-17T22:54:53.323 に答える
0

NSISが LZMA 自己解凍プログラムをどのように作成するかを見ることができます。その後、おそらく DLL エントリ ポイントで拡張できます。

または、NSIS スクリプトを使用して自己抽出プログラムを生成し、そのスクリプト言語を使用して DLL エントリを作成することもできます。

于 2011-02-17T21:53:09.523 に答える