質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

953閲覧

7-Zip32について

BeatStar

総合スコア4958

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/08/20 02:05

編集2018/08/22 01:14

2,3質問があります。

まず、私は趣味でC++をやっています。一応Qtを使っていますが、今回は(多分)そこまで関係がないので割愛します。

7-Zip32.dllに関してです。

DLした7-Zip32.dllですが、「7-ZIP32.DLL Version 9.22.00.02」となっています。( 注意: Q3は書いていて意味がわからなくなったので排除。Q1, Q2のみです。 )

[前提]: 7-Zip32.dll (以降7Z) で編集(追加,削除etc.) を行ったZIPファイルや7Zが対応している圧縮ファイル等を操作する

Q1. 解凍をせずに読み込むことは可能か?

例えば 調べた範囲ではJavaのjarファイルは実際にはzipファイルだそうです。
で、私はできれば例えば installdata.zip として実行ファイルと同じディレクトリかサブディレクトリ内に置いておき、
あたかも普通のバイナリファイル( *.bin etc. ) やテキストファイルとして読み込むような感じで
メモリ上に展開するというのでしょうか? 解凍せずにデータを読み込む方法はありますでしょうか?

一時的に解凍 -> 終了間際 ( main関数から抜けるとき等 ) にそれらを削除 ...

でもいいですが、この方法だとGUIのときは 閉じる命令 ( メッセージ ) が飛んで来たら 行えばいいですが、
一括処理等のようなCUI(でやるような)場合、なんらかの理由で中断する場合、解凍したファイルが残っているで
自分で削除しないといけないです。

これをJavaでの jarファイルのように「解凍せずに」使用する方法はありますでしょうか?
最終的にはzipファイルから取り出しているので解凍しているはずですが、
名称が思いつかないので「解凍せずに」としました。

やはりWindowsとかの一時フォルダとかに解凍して...ってなるのでしょうか?

Q2. 7Zで生成した自己解凍書庫のアイコンを変えることは可能でしょうか?

ショートカットファイル ( *.lnk ) で設定できるのはわかっていますが、
できれば自己解凍書庫自体のアイコンを変えることができればやりたいのですが。

もしライセンス表示のようなもの ( Qtで言えば aboutQt関数みたいな? ) 等のように無理ならいいですが。
そこまで強い要望ではないので。

~~
Q3. 自己解凍書庫のとき、7z.sfxを使っているのですが、同梱の7-zipCMD.txtの"-sfx"の項目を見ると
「設定ファイル」というのがあるみたいです。
解凍するときのウィンドウのタイトルや解凍場所( ディレクトリ ) 等を指定できるみたいです。
ですが、これの使い方がよくわかりません。~~

( 一応、生成時はそのまま自己解凍書庫を生成しています。(zipファイルも7zファイルも仲介していない状態。)
( 仲介するなら zipファイルか? )

例えばコマンド ( SevenZip関数に渡す引数の一つとして )として、

"a -sfx7z.sfx HELLO.EXE C:\test\cpp\file1.txt -dDEFINITION.txt"

のように -d<定義ファイルのパス> といった感じで認識させるとか、sfxを操作する実行ファイル側と同じディレクトリに定義ファイルを置くとか、
自己解凍書庫と同じディレクトリに定義ファイルを置くとか...

~~
それぞれ試してみましたが、どれも変わりませんでした。( デフォルトのまま。 )~~
~~
必要なものは 7z.sfx,自己解凍書庫の名前, 自己解凍書庫にするファイル( *.zip ) の3つですよね?~~

書いていて思ったのですが、もしかして 一旦7zにしないといけないってことでしょうか?

[情報]
言語: C++ ( C++11 )
コンパイラ: MinGW
OS: Windows 10
7-Zip32.dllのバージョン: 7-ZIP32.DLL Version 9.22.00.02


[追記1]

t_obaraさんの修正依頼(?)を読みました。

あ、確かにそうですね。外出先から書いているので完全に再現することはできませんが、
まず、動的リンクをしていて、関数はSevenZip関数, 列挙系関数群 ( FindFirstとか ) を使える状態にしてあります。
( もちろん 必要な構造体は用意してあります。 )

同梱の 7-zipAPI.txt を見てみると列挙系は

  1. アーカイブを開く
  2. FindFirstで読み取る -> エラーが返されたらここで終了
  3. while + FindNext で次々に読み取る
  4. アーカイブを閉じる

とやっています。で、3と4の間に(格納されている)ファイルのサイズやらを取得していますが。

解凍は SevenZipに渡す文字列コマンドは

x アーカイブ [解凍したいファイル] -o解凍先

だったと思います。( 外出先ですので。 )

一応テキストエディタ側の"検索" で"メモリ"をキーワードにして検索かけてみましたが、「圧縮時のメモリ」云々で今回とは関係なさそうだったので...

(もうちょっと情報は必要ですか? 今外出先なので手元に問題のファイルがない...orz)


[ 追記2 ]

lunateaさんのコメント ( 修正依頼の方 ) 読みました。

すみません、書き方が悪かったみたいです。私が言いたかったのは、7-Zip32.dllのライセンスじゃなくて、アイコンを書き換えることができるかどうか。っていうことです。

スポーツは詳しくないですが、アディ○スとかのシューズをサッカー選手とかが使う場合、その会社のロゴは伏せることができませんよね。広告塔としての役割のため。

たとえば私が 7-Zip32.dllを使ってSFX(自己解凍書庫)にするソフトを作ってリリースしたとします。
それで生成したSFXのアイコンは7zのやつになっています。
これが広告塔の役割になって...ならアイコンは消せないはずなので。
そっちの意味で書いたのですが、書き方が悪かったですね。すみません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2018/08/20 05:00

Q1について:まず、マニュアルを読み、できそうか判断し、判断が難しいのであれば、簡単なプログラムを作成してみて試してみることが一番理解が進むと思います。少なくともマニュアル・ドキュメントを読んでみて、どのように考えたのかを提示いただかないと、丸投げと認識されてしまうのではないでしょうか。
BeatStar

2018/08/20 05:41

追記しました ( "追記1" )
退会済みユーザー

退会済みユーザー

2018/08/20 08:33

Q2の回答だけだとアレかなーと思ったのでこっちに書きます。7-zip32.txtにソフトの改変再配布について書かれています。ライセンスはLGPLです。
guest

回答2

0

A1. メモリへの展開、という意味だと思いますが
私は作者じゃないので「マニュアル読む限り無理っぽい」としか言えません。
気になるなら7-Zip32.dll作者さんのサイトにサポート掲示板あるのでそちらで聞くのが筋かと

ちなみに私ならば7z.dllを直接使う方法を探ります。
こっちはこっちでまともなドキュメントないのでソースの読みこみが必要ですが。

A2. sfxにアイコンが埋め込まれているのならばリソース書き換えでどうにかなる可能性はありますが
C++でどうにかするよりはResource Hackerなどの既存ツールでどうにかするのが一般的ですね

投稿2018/08/20 19:47

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2018/08/26 04:14

ご回答ありがとうございます。(忘れていました...すみません。) あー、やっぱり製作者に問い合わせてみますね。
guest

0

ベストアンサー

Javaの jar は、単独で実行できるわけではありません。 Javaが読み込んで実行しています。
中身の詳しい事情は知りませんが、荒っぽく言えば、Javaが jarファイルを読み込んで(内部で展開し)、実行しています。

従って、

Q1. 解凍をせずに読み込むことは可能か?

誰がこの処理を行うかですね。自己解凍ファイルは、先頭に実行プログラムがあり、これが、本体の圧縮されたデータの解凍と実行を行う事になります。
7-ZipのDLLでメモリに展開できたとして、何がしたいのでしょうか? 展開できたデータを実行したいという事でしたら、不可能ではないでしょうが、今の Windowsではかなりの技術力を要求されると思います。

投稿2018/08/20 13:00

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2018/08/22 01:23

>> Javaの jar は、単独で実行できるわけではありません。 Javaが読み込んで実行しています。 確かにそうみたいです。私がやりたいのはまさにこれです。 少なくともユーザからは圧縮ファイルを解凍せずにテキストファイルを読み込んでいるかのように処理したいってことだけです。 やりたいイメージとしては(可能であれば) zipファイルの拡張子をオリジナルに書き換えて、binファイルが同梱されているインストーラのような感じで処理することです。インストールならいいですが、例えば(C++とかから読み込めるような、入門系のサイトにあるような)バイナリファイルみたいに読み込んで、それを処理できるなら バイナリファイル? として definition.zip ( あるいは definition.abcとか? ) とかみたいに置いて 中身はテキストファイルなりバイナリファイル ( テキストファイルのサイズを小さくするために )なりが複数あって...とか。それを7-Zipの列挙系関数で一個ずつファイル名を取得してjarファイルのときみたいに「ユーザ側からは解凍しているようには思えない」(= ディレクトリを汚さない ) という風にしたかっただけです。 やはり無理でしょうか?
pepperleaf

2018/08/22 12:33

無理じゃないと思います。 ただし、Javaがやっている事を jarを展開しての実行。 展開するのは、7-Zip とかのライブラリを使えば、簡単にできるでしょうが、問題はその後。展開したコードを逐次、実行 .... 要するにインタープリター。まあ、結構、大変な事と思います。 (Java と同様のものを作るという事) ファイルに展開の件は、Unix(多分、Linuxも)だったら、読み書き用ファイルを作成し、オープンしたら、即、削除って方法を使えば、クローズ時に自動で、削除。Windowsについては分かりませんが。
BeatStar

2018/08/26 04:16

(ああ、忘れていました...) やはりファイルを実際に解凍する方法になっちゃいますね...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問