質問

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

7za.exe という LZMA のコマンド ライン バージョンがあり、それを何らかの方法でプログラムに埋め込んで関数のように使用できないか考えています。system() 関数で簡単に使用できますが (使用すると非常に危険なようです)、正しいフォルダーに 7za.exe を持っていない人にプログラムを送信すると、機能しません。

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

役に立ちましたか?

解決

CreateProcess()は、あなたがそれのHANDLEを知ることによって制御できること、あなたのプログラムの子として、それはのように聞こえるとおりに、プロセスを開始するには、Windows APIの呼び出しです。 system()は、システムコマンドを実行します。あなたが知っているだろうと私は個人的にすべてのコストでそれを使用しないような限りそれの - なく、少なくともそれは、ポータブルでないためには、(機能は、WindowsおよびLinux上に存在するが、コマンドしません)

。 これはどのようにインストーラの仕事である -

EXEイメージの末尾にデータを追加することが可能です。異様に基本的にあなたのコードを提供します。このマイクロソフトサポート記事に、見ていますが、する必要があります自明C ++にそれを回すことができます。ここで自己解凍型を作成noreferrer">

をより詳細にexeファイルに付加します。

他のヒント

よし、これを試してみよう...

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top