1

コンパイル中に既存の.exeファイルを他のC++ソースファイルにリンクする方法はありますか?私が実際にやろうとしているのは、LZMA(7zip)SDKを使用してコンソールプログラム内のいくつかのファイルを圧縮および解凍することですが、残念ながら初心者には使用するのが非常に困難です。

7za.exeと呼ばれるLZMAのコマンドラインバージョンがありますが、どういうわけかそれをプログラムに埋め込んで関数のように使用できるかどうか疑問に思っています。system()関数(使用するのは非常に危険なことのようです)で簡単に使用できますが、適切なフォルダーに7za.exeがない人にプログラムを送信すると、機能しません。

windows.hヘッダーファイルでCreateProcess()関数に出くわしましたが、system()が行うことをより適切かつ高度な方法で実現しているようです。コンパイル時にオブジェクトファイルのようにexeファイルを実際にリンクできるかどうかわかりません

4

2 に答える 2

4

CreateProcess()は、プロセスを開始するためのWindows API呼び出しであり、プログラムの子として、それがであることがわかることで制御できますHANDLEsystem()システムコマンドを実行します。それはあなたが知っている限りのことであり、私は個人的にそれを絶対に使用しないようにしています-特にそれは移植性がないためです(関数はWindowsとLinuxに存在しますが、コマンドは存在しません)。

EXEイメージの最後にデータを追加することができます-これがインストーラーの動作方法です。このマイクロソフトのサポート記事をご覧ください。この記事では、奇妙なことに基本的なコードが提供されていますが、簡単にC++に変換できるはずです。これは、より適切な自己解凍型ファイルの作成に関する記事です。どちらも、exeにファイルを埋め込むことができるはずです。

またはから抽出7zaして呼び出すことはお勧めしません-SDKを学ぶことをお勧めします。難しいですが、それを行うことで多くのことを学ぶことができます。System()CreateProcess()

最後に、既存のexeファイルを変更する必要があるため、コンパイル時にこれを行うことはできません。コードに、独自の画像または別の画像に何かを追加させる必要があります。

exeファイルに追加されたデータのアドレス指定の詳細。

于 2010-03-22T23:58:30.287 に答える
1

さて、これを試してみてください...

  1. あるファイルを別のファイルの最後にコピーするだけのコマンドラインユーティリティを作成します。これは、WindowsファイルI/Oまたはシェルコマンドを使用して行うことができます。
  2. このユーティリティを実行するビルド後の手順を実行します。プログラムは通常の方法で完全にリンクし、ユーティリティは2番目のexeのバイトをターゲットexeに追加するだけです。

それがリンクのステップです。現在、exeへの実行時アクセスは別のものです。基本的に、アルゴリズムは次のとおりです。

  1. バイトレベルのバイナリエディタに埋め込むためにEXEを開きます(msdev.exeで十分です)。ファイルの先頭の一意のマーカーとして、最初の30バイトまたは40バイトに注意してください。
  2. 上で作成した複合ファイルを開き、一意のマーカーを探して埋め込みファイルを検索する関数を記述します。
  3. 埋め込みファイルの先頭が見つかったら、ファイルI / Oを使用して、そのファイルのバイトを2番目の新しいファイルにコピーします。
  4. system()または同様のAPIを使用して新しいファイルを実行します。

この方法で他の人の作品を配布する場合は、正しいライセンスを取得してください。他人のバイナリを自分のものに投げ込むことは、一般的に著作権侵害です。もちろん、例外もあります。

于 2010-03-22T23:58:55.357 に答える