松ちゃん本舗 - 来店記録の間 -
過去ログその9
(2003/01/01〜2003/11/30)
>hiroさん
>常に解凍先に同ファイルが存在する場合に上書きメッセージが表示されるようにSFXを作成
>したい
WinSFX32(M)のオプションでは通常、上書き確認メッセージが表示するはずですが…。
コマンドラインで""""となっているところが気になるので、Chr(34)と書きかえてみてくだ
さい。
はじめまして、現在、自己解凍ファイルを作成し解凍すると上書きメッセージが表示されないんです。
常に解凍先に同ファイルが存在する場合に上書きメッセージが表示されるようにSFXを作成
したいのですが、どうしたらよいですか?
ちなみに、下記のように書いてるんですが・・・
strOption = "S -GWJ2 -GYWTEST -GYDC:\TEST " & """" & p_strInPath & strLzhName & """" & " " & """" & p_strOutPath & """"
よろしくお願いします。
このサイトにあるのに質問してすみません。
かなり見落としてました。お許し下さい。
有難う御座いました。
未対応とは知りまんでした。
まだ初心者でUNLHA32での圧縮解凍は他のサイトのサンプルで何とかできました。
ZIPの圧縮解凍の簡単なコードを教えてもらえませんか?
お手数ですがよろしくお願いします。
>のこやん様
UNZIP32.DLLはUNLHA32.DLLとは違い解凍専用のDLLで、圧縮には対応していません。
ZIP32J.DLL+ZIP32.DLLと組み合わせるか、7-ZIP32.DLLを利用するかの
2点になりますが、後者はDLLが開発されてまだ新しいため、前者の方を
おすすめします。
よろしくお願いします。
はじめまして。
VB5でUNZIP32での圧縮は可能ですか?
コマンドが書かれていないので教えて下さい。
他のサイトでも解凍しか書かれていません。
よろしくお願いします。
返事が遅れて申し訳ありません。
>あくせるさん
>騎手、競走馬、牧場等の対応表も是非お願いしたい。
競走馬の元ネタは書いていますが、騎手や牧場はだいたいの方が知っている内容と
思われますので掲載してません。ただ今後必要になれば掲載も検討いたします。
連載が終わってもう3年経っていますが、2chの掲示板にもスレッドがありますし、
まったく色あせていませんね。
(今週、グリーンチャンネルの「うまくら」でも取り上げられた模様)
はじめまして こんいちわ
今さらですが 【じゃじゃ馬ぐるーみん★UP】のコナー気に入っています
騎手、競走馬、牧場等の対応表も是非お願いしたい。
予想でもいいので…期待。
例
弓削匠=武豊
醍醐ファーム=社台ファーム
レットー=イットー
よろしくでございます
レスが遅れて申し訳ありません。
VBでLoadLibrary()〜GetProcAddress()が利用できることがわかっていますが、
C言語のようにポインタなどが使えないのでかなり難しいようです。単独でDLL
を使うならDeclare Functionを使うほうが簡単ですし、SearchPath()を使えば
DLLの存在も確認できます。
↓にあるサンプルソースを見て参考にしてくださいませ。http://www.geocities.co.jp/SiliconValley-SanJose/1892/pc/arcsrc.html
>フメミヨさん
たしかに作者が「めぞん一刻」の影響を受けているのは有名ですからね。
>渡会千草→響子の母、千草
というよりは音無(旧姓:千草)響子と考えたほうがいいかもしれませんね。
じゃじゃグルって、「めぞん一刻」と酷似してますよね。
ひびき→響子 醍醐→五代 久世駿平→三鷹瞬+九条明日菜
二階堂→二階堂(ポっと出) 渡会千草→響子の母、千草 ってな具合に。
ただ単に、舞台が「下宿館」から「牧場」に変わっただけな感じで。
いや、面白いんですけどね。
>たこさん
こちらこそあけましておめでとうございます。
一応、普段どおりにすごしましたけどね>年末年始
なお、今年は厄年なので何事も慎重に行動することを心がけます。
>恋風読まれました(*´∀`)?
いやあ、なかなか読む機会がないですね。
古本屋で調べてみるか。
こんばんは。あけましておめでとうございます! たこです(´∀`)。
こちらでは物凄くご無沙汰ですが、チャットや掲示板にいつも書き込み
ありがとうございますです。どんな年末年始を過ごされましたか?
たこはお参りに行くしょっぱなから寒さから腹を壊しました(´д⊂)。
仏様からの去年の罰でもくらったんでしょうか(笑)?
何はともあれ(笑)、今年もよろしくお願いします。
短信ですが、年始のご挨拶でした。失礼します。
P.S 恋風読まれました(*´∀`)?
解決しました。
パスを指定することにより解凍できました。
はじめまして。
VC++ 6.0 の開発環境で tar32.dll を利用した、tar.gz ファイルの指定解凍の
方法について教えてください。
例えば、"test.tar.gz" というファイル内にある、拡張子が ".txt" のファイル
だけ解凍しようとして、
-xvf C:\test\test.tar.gz *.txt
を実行すると、".txt"ファイルだけでなく、すべてのファイルが解凍されていま
います。
試しに、
-xvf C:\test\test.tar.gz -o C:\test\ *.txt
-xvf "C:\test\test.tar.gz" "*.txt"
に変えてやってみましたが、やはり、すべて解凍されてしまいます。
関数は、以下のように使用しています。
--------------------------------------------------------------------------------
int nStatus;
char szCmdLine[1024], szOutput[1024];
typedef int (WINAPI *TAR32)(const HWND hwnd, LPCSTR pszCmdLine, LPSTR pszOutput, const DWORD dwSize);
HINSTANCE hTarDll;
TAR32 pfnTar;
fileName = strFile.GetBuffer(10);
strFile.ReleaseBuffer();
// tar32.dll をロードする
if ((hTarDll = LoadLibrary("tar32")) == NULL)
{
// エラー処理
}
// tar32.dll 内の Tar 関数のアドレスを取得する
if ((pfnTar = (TAR32)GetProcAddress(hTarDll, "Tar")) == NULL)
{
// エラー処理
}
sprintf(szCmdLine, "-xvf C:\\test\\test.tar.gz *.txt");
ZeroMemory(szOutput, sizeof(szOutput));
nStatus = pfnTar(NULL, szCmdLine, szOutput, sizeof(szOutput));
if (nStatus == 0)
{
// tar.gz ファイル解凍成功
}
else
{
// エラー処理
}
// Tarライブラリを解放する
FreeLibrary(hTarDll);
--------------------------------------------------------------------------------
以上、アドバイスよろしくお願いします。
教えてもらったスイッチを追加して環境を変えて実行したらうまくいきました・
ありがとうございました。
加えましたか?
色々試したのですが、解凍時にメッセージが表示されないのですが・・
お手数ですが、strOption = "S -GWJ2 -GYWTEST -GYDC:\TEST " & """" & p_strInPath & strLzhName & """" & " " & """" & p_strOutPath & """"
で書いてみてもらえないでしょうか?
調べてみました。
自己解凍書庫は書庫内のタイムスタンプが古い場合はスキップするみたいです。
"-gyc0"スイッチを加えると上書きチェックが行われるようになりました。
よろしくお願いします。
やっては見たのですが・・・
依然メッセージが表示されません。
書き方がおかしいのでしょうか?
他に書き方ありますかね〜?
VB6.0でcab32.dllを使って
csvファイルを圧縮するプログラムを作りたいのですが、
LoadLibrary()とGetProcAddress()の使い方が
いまひとつ分かりません。
どなたか教えていただけないでしょうか?
どうもいきなりの質問に答えていただきありがとうございます。
早速ためしてみます。
どうもありがとうございました。
>シローさん
CD-R/CD-RWに対応しているカーオーディオであれば、音楽CDモードでCDを作成しておけば
とりあえず聞けますが、音楽CDからWAV形式で取り込んだほうが音質はよいのでMP3→WAV
への変換はおすすめできません。CD-R/CD-RWに対応していない場合でも、iPodなどに代表
される携帯用MP3プレイヤーやそれに準じるものをお持ちでしたら、FMトランスミッター
を使う方法がありますので参考になさってください。
iPod対応のFMトランスミッター「iTrip」
http://www.avenue-d.com/welcome/mac/1366.html
あのーなにかプロの方がおられるようで恐縮なんですがぜひとも教えていただきたいことがありまして。
じつはMP3なんですが自分の車のオーディオで聞きたいんですが聞けないのです。
いろいろ調べてみたのですが、分からないので教えてもらえませんか?
MP3をどうしたら車載オーディオで聞けるのですか?
車のオーディオがMP3に対応してないのでどのようにしたらきけるようになるのですか?
返事が遅くなってすいません・・
ブラスターにPCをやられてしまい返事が遅くなってしまいました
-tで格納ファイル名を取得して出力パスと連結する事で解決しました
TarOpenArchive()〜TarFindFirst()〜TarFindNext()〜TarCloseArchive()
の方もやってみたいと思います
どうも今回はありがとうございました
>虎壱さん
解凍のさい、Tar()のszBufferに内容が入らないのはTAR32.DLLの仕様のようです。
解凍先のフルパスを取得する場合、解凍前にTarOpenArchive()〜TarFindFirst()
〜TarFindNext()〜TarCloseArchive()を実行して圧縮ファイルのパス情報を取得、
その後WorkPath自体が絶対パス(ドライブ名が入ったパス)か相対パスかどうかを
判断。絶対パスの場合はWorkPathと書庫ファイル名、相対パスの場合はカレント
パス+WorkPath+書庫のパス(ただ相対先に..がある場合はカレントフォルダの
上位のフォルダに移動)が解凍されたファイルのフルパスとなります。
ややこしくなるかもしれませんがよろしくお願いします。
お久しぶりです
前回は本当にありがとうございました
質問なのですが解凍処理で解凍したファイルのフルパスを取得処理を作成しています
LHAとZIPはうまくバッファを利用して取得できたのですが
tarだけバッファに何も入ってなく解凍先のフルパスが取得できません
何かいい方法はありますでしょうか?(解凍は正常でできます)
//書庫操作のAPI関数の宣言
typedef int(WINAPI *TAR)(const HWND, String* , LPSTR , const DWORD);
//UNZIP32.DLLの読み込み
HIN_lib = LoadLibrary("tar32.dll");
//API関数のアドレスを取得
TAR Tar = (TAR)GetProcAddress(HIN_lib,"Tar");
//解凍形式、解凍対象ファイルパス、解凍先フォルダパスなどの必要情報を変数に格納
Str_Defrosting=String::Concat("-x --display-dialog=0 ","\"",Convert::ToString(listBox_FilePath->Items->Item[Int_ListCount]),"\" ");
Str_Defrosting=String::Concat(Str_Defrosting,"\"",WorkPath,"\"");
//解凍処理(成功なら0が返る、失敗なら0以外の数字が返る)
Chr_Check=Tar(NULL,Str_Defrosting,Chr_Buffer,1024);
//解凍結果を返り値用変数に格納
Str_Out=Chr_Buffer;←ここで何もDLLの処理結果が入っていない・・
>UNYORAさん
確かに、UNRAR32.DLLにUnrarExtractMem()のエントリはありますが未実装となっていますね。
これではどうしようもないので、一時フォルダに解凍→ShellExecute()で開く→ファイルを
削除というプロセスが考えられます。
ファイルが開いた時点で解凍ファイルが削除できなくなる可能性もあるので、開いたアプリ
ケーションを閉じるまで監視させるというのはどうでしょうか?
こんにちは、UNYORAです。
RAR書庫ファイルの中にあるファイルをHDD上に展開せずにファイルを取り出したいのですが、
マニュアルを見ると、UnrarExtractMemはUnrar32.dllに実装されていないようです。
メモリーに展開させる方法はほかにあるのでしょうか?
>いかさん
コマンドラインに-cオプションが指定されていない場合は更新日時が
新しい場合のみ上書きされます。
x命令で解凍された場合は状況により上書き確認が行われます。
解凍先に、同じファイル名又はフォルダ名がある場合は、解凍は、どうなるのでしょうか?
上書きがそれとも解凍されない?
すいません、ようやく発見しました。
LHAは-nオプション
ZIPは--iオプションですね。
こんにちは、UNYORAと申します。
UnlhaExtractMemを使用すると進捗状況が表示されますが、これを消すには
どうすればよいのでしょうか?
ご存知の方おられましたなら、教えていただけないでしょうか。
TACというのはたぶんシェアウェアの「卓駆★ for Windows95」だと思いますので、
試用目的で確認しましたが、正常にフォルダごと圧縮できました。
考えられる問題は
・TACの[ツール]−[書庫ツールの設定]−「フォルダ」タブにある「解凍時に書庫フォル
ダをチェックする」がチェックされていない
・UNLHA32.DLLの設定ダイアログの「ディレクトリ構造を無視」にチェックが入っている
TACではDLLのダイアログを呼び出すことができませんので、当サイトの解凍ツールなど
からDLLのダイアログを呼び出し、チェックを確認してみてください。
横浜から、はじめまして。
普段、TACでdllを使って圧縮・解凍しており、特に不自由は感じなかったのですが、
今回、Webページを圧縮して添付送信しようと、index.html と IMAGEフォルダ(index.htmlで表示するGIFファイルを収容)を一緒に、フォルダはフォルダのまま
内部のGIFファイルごと圧縮するにはどうしたらよいのでしょう?
index.html と IMAGEフォルダをtmpフォルダにいれそれを圧縮しても、IMAGEフォルダの
中身がindex.html と同位になって、即ちIMAGEフォルダから飛び出して圧縮されてしまいます。 お助けを。
雪影さんありがとうございます
#pragma comment(lib,"shlwapi.lib")
で解決しました、ありがとうございました
返事遅くなって本当にすいませんでした
紛らわしい書き方ですいません。
インポートというのは、ライブラリをプロジェクトに参加させる、
という意味で書いていました。
プロジェクトのオブジェクト/ライブラリモジュールにshlwapi.libを追加するか、
プログラム中に
#pragma comment(lib,"shlwapi.lib")
を書いておくと解決すると思います。
雪影さんありがとうございます
PathAddBackslash(LPTSTR)のやり方を試してみたのですが
shlwapi.libのインポートをすると
fatal error C1083: タイプ ライブラリ ファイルを開けません。'c:\program files\microsoft visual studio .net 2003\vc7\platformsdk\lib\shlwapi.lib': タイプ ライブラリ/DLL の読み込みエラーです。
というエラーが出ます
これはshlwapi.libが存在しないからなんでしょうか?
何処かからshlwapi.libを落としてこないといけないのでしょうか?
#include "stdafx.h"
#include <windows.h> //windows.h のインクルード
#include <shlwapi.h>
#import <shlwapi.lib>
一番簡単な方法は、
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/shlwapi/path/path.asp
の中の、
PathAddBackslash(LPTSTR)
を使うことだと思います。使うときはshlwapi.hのインクルードと
shlwapi.libのインポートを忘れないよう注意してください。
この関数を使わずにやるときは、
1.distStrの最後から2番目の文字が2バイト文字の1バイト目でない
&& distStrの最後の文字が「\」でない
2.distStrの最後から2番目の文字が2バイト文字の1バイト目である
のどちらかの条件を満たしているときにdistStrの末尾に「\」を付加すればいいと思います。
charが2バイト文字の1バイト目かを判別する関数は、
_ismbblead(unsigned int)
インクルードするライブラリはmbctype.hです。
おかげさまで現在順調に解凍ツールができているのですが
解凍先のパス指定で c:\output と最後に\をつけない状態でも解凍できるようにしたいのですがどうやったらいいのでしょうか?(c:\output\だとちゃんと解凍してくれます)
パスが入ってるdistStrの検索をして最後に\を付加するやり方でいいのでしょうか?
""(ダブルクォーテーション)の兼ね合いもあってよくわかりません・・・
解決策がありましたら教えていただきますようお願いします
//各オプションから文字列抽出処理
int o, size = 0; //変数の宣言
for (o = 1; o < argc; o++)
size += int(strlen(argv[o]) + 1); //各オプション文字列数に+1をする
char *command_line = new char[size + 1];
command_line[0] = '\0';
for (o = 1; o < argc; o++)
{
//各オプション文字列を半角スペースで区切る
strcat(command_line, argv[o]);
strcat(command_line, " ");
}
//入力元のパスに何も文字が入ってない場合はプログラム終了
if (argv[1]==NULL)
{
printf("Option error : input error");
return 0; //プログラム終了
}
//解凍元・解凍先のパス入力処理
//解凍元パスの文字列を格納
sprintf(sourceStr, "%s",argv[1]);
//解凍先のフォルダパスの文字列を格納
sprintf(distStr, "%s",argv[2]);
// プログラムで利用するAPI関数をtypedefで宣言します
//書庫操作のAPI関数
typedef int(WINAPI *UNLHA)(const HWND, LPCSTR , LPSTR , const DWORD);
// LoadLibraryでDLLを開きます。(DLLの読み込み)
lib = LoadLibrary("UNLHA32.dll");
//API関数へのアドレスを、GetProcAddressでキャストする。
UNLHA Unlha = (UNLHA)GetProcAddress(lib,"Unlha");//APIへのアドレスを取得
//解凍プログラム
/*必要な情報(解凍元、解凍先、必要ならオプション設定や解凍するファイル)を取得*/
//入力したパスをコマンドへ格納
sprintf(cmdStr, "x -gm -c1 -n \"%s\" \"%s\" \n", sourceStr, distStr);
//バッファサイズ指定
char resBuf[BUF_LEN];
//Unlhaを使用して解凍
int resultCode=Unlha(NULL,cmdStr,resBuf,BUF_LEN);
// printf("%s\n",cmdStr); //確認の為cmdStrに格納されてる文字列を表示
//解凍に成功したとき
if(resultCode==0) printf("Extract : %s\n",distStr);
else
{
//解凍に失敗したとき
printf("Output error : %s\n",distStr);
}
// ロードしたDLLを開放します。
FreeLibrary(lib);
雪影さんありがとうございました
やっぱり制約をつけないと駄目ですか・・
「""」で囲むやり方でやってみます
ありがとうございました
これは、入力するときにパスを「""」で囲む、という方法じゃ駄目ですか?
("実行元パス・ファイル名" "解凍元パス・ファイル名" "解凍先パス・フォルダ名")
そういう制約がないとすると、入力が絶対パスを指定させることにして、
引数の文字列の2番目が「:」になるまでは前のパスに付け加えていく、
という解決方法しか思いつきません(「:」はファイル名に使えないから)。
結局は入力に制約を課すことになりますが。
前回はありがとうございました
恐れながらもう一つ質問なんですが
現在DOSを起動して
"実行元パス・ファイル名 解凍元パス・ファイル名 解凍先パス・フォルダ名"
(間隔は半角スペース)
と打ち込んで解凍処理をしているのですがファイル名やフォルダ名にスペースが含まれている場合うまく認識してくれません、どうやったら認識してくれるんでしょうか?
"[]"を使うと認識するらしいのですがうまくいきません・・
解決策がありましたらよろしくお願いします
//各オプションから文字列抽出処理
int o, size = 0; //変数の宣言
for (o = 1; o < argc; o++)
size += int(strlen(argv[o]) + 1);//各オプション文字列数に+1をする
char *command_line = new char[size + 1];
command_line[0] = '\0';
for (o = 1; o < argc; o++)
{
strcat(command_line, argv[o]);//各オプション文字列を半角スペースで区切る
strcat(command_line, " ");
}
//解凍元・解凍先のパス入力処理
sprintf(sourceStr, "%s",argv[1]);
sprintf(distStr, "%s",argv[2]);
FindFirstFile・FindNextFileでやってみたいと思います
雪影さんありがとうございました
ZIP形式についてですがちゃんと"-x c:\\*.zip c:\\output\\"
と文字列を入れても解凍出来ませんでした
恐らくFindFirstFile・FindNextFileを使ってファイルを抽出して解凍しないといけない
と思いますのでがんばりたいと思います(^^;)
>虎壱さん
ワイルドカード指定するとUnlhaCheckArchiveがファイル名"*.lzh"のファイルを探すから
じゃないでしょうか。複数のファイルを指定するためにワイルドカードを使うのなら
自分でファイル名を解決する必要があると思います。
まずFindFirstFileで"c:\*.lzh"にマッチするファイルを探します。
そしてFindNextFileでマッチするファイルがなくなるまで検索します。
これらの結果得られたファイル名ひとつひとつに解凍処理をかけるといいんじゃないでしょうか。
もうひとつの問題のほうですが、おそらく"x c:\\MSN.lzh c:\\output\\"のような形式に
なっていると思うんですが、Unzipの場合最初のオプションの部分が"x"ではなく"-x"
になります。こうしていても駄目で質問していたらすいません。
LZH形式では解凍処理単独でワイルドカードの処理が出来たのですが
ZIP形式とZ形式だと単独でも解凍出来ません・・・
何か特別な処理が必要なんでしょうか?
お手数ですがよろしくお願いします
先程はDLさせて頂いたのにうっかりとお礼も言わずにすみません。
どうもありがとうございました。
OLEDragDropでファイルかフォルダかの分岐が違っていたようです。
サンプルソースは不慣れな私にとってはとても貴重です。これから
もよろしくお願いいたします。。。って他力本願な。。(^^ゞ
LZH形式の圧縮対応VB6.0版(22KB)とDLLをダウンロードさせていただきました。EXEを走らせ"test.txt"というファイルをD&Dしたのですが反応がありません。"test.txt.lzh"が出来るようですが検索しても見当たらずエラーもでません。何故なんでしょう?ZIP形式の方はちゃんと作動していました。
前回はありがとうございました
あれから形式チェックやZIP形式の解凍も出来るようになったのですが
解凍ファイルの指定の時にc:\*.lzhやc:\*.*などのワイルドカードを指定しても
全部else処理へ行ってしまいます(ファイル名を指定した場合は大丈夫です)
色々検証してみた結果解凍処理単独ですと大丈夫なんですが
形式チェック処理を間に入れるとうまくいきません
恐らく形式チェックのif文を何とかすればいいと思うのですが
どうやればいいかわかりません・・・
解決策がありましたらよろしくお願いします
//hFindの宣言
HANDLE hFind;
//解凍元・解凍先のパス入力処理
scanf("%s %s", sourceStr,distStr); //解凍元パスの文字列と解凍先のフォルダパスの文字列を格納
hFind = FindFirstFile(distStr, &FindFileData); //解凍先のパスをhFindへ入れる
//LZHファイル形式チェック用API関数宣言
typedef BOOL(WINAPI *UNLHACHECKARCHIVE)(LPCSTR _szFileName,const int_iMode);
// LoadLibraryでDLLを開きます。(DLLの読み込み)
lib = LoadLibrary("UNLHA32.dll");
//APIへのアドレスを取得
UNLHACHECKARCHIVE UnlhaCheckArchive = (UNLHACHECKARCHIVE)GetProcAddress(lib,"UnlhaCheckArchive");
if(UnlhaCheckArchive(sourceStr, CHECKARCHIVE_BASIC))
{
//解凍元のファイルがLZH形式だった
UNLZH(); //LZH解凍処理
}
else //解凍元のファイルがLZH形式でなかった
{
}
雪影さんに教えてもらったとうりにしたら
パス指定が出来ました ありがとうございます
教えてもらったHPに行ってみて勉強したいと思います
色々ご教授いただきましてありがとうございました
>虎壱さん
コマンド文字列を作る部分は
char cmdStr[CMD_LEN];
char sourceStr[PATH_LEN]; //解凍元
char distStr[PATH_LEN]; //解凍先
scanf("%s", sourceStr); //この前に入力を促す文を入れると良いと思います
scanf("%s", distStr);
sprintf(cmdStr, "x \"%s\" \"%s\" \"*.*\", sourceStr, distStr);
でできると思います。あとはscanfで取ってきた文字列をチェックしたりする必要は
ありますが一応テストするだけなら十分でしょう。
http://www.bohyoh.com/CandCPP/C/
↑のページなどでライブラリ関数について見てみたりすると
勉強になって良いんじゃないでしょうか。
自分のプログラムとしてはほとんどコピーですがこうなっています
char cmdStr[]="x c:\\MSN.lzh c:\\output\\ \n";
//バッファサイズ指定
char resBuf[BUF_LEN];
//Unlhaを使用して解凍
int resultCode=Unlha(NULL,cmdStr,resBuf,BUF_LEN);
//解凍に成功したとき
if(resultCode==0) printf("Extract Success\n");
これだとあらかじめ解凍元と解凍先が指定されているので
プログラムを起動してから解凍元と解凍先のパスを打ち込んで
解凍するプログラムにしたいと思っています
char cmdStr[]="x c:\\MSN.lzh c:\\output\\ \n";の部分をscanfなどで
文字列を入力して出来るかなとやってみたんですがうまくいきませんでした
cmdStrを何とかすれば出来そうなんですが・・・
>虎壱さん
うーん、どういう風に作ってあるのか想像できませんが、
解凍元と解凍先の文字列の取得はできてるんですよね?
それならあとはsprintfを使って文字列を整形してコマンド用の文字列にすれば
できると思うんですが。
例のパスを入力しているのに「s{81}.lzhが見つかりません」というのは
おかしいと思うので、printfでコマンド用の文字列(以前の例ではcmdStr)や、
解凍元、解凍先の文字列を確認してみてはどうでしょうか。
見当違いの回答をしていたらすいません。
またまたすいません
雪影さん、松ちゃんさんに教えていただき無事解凍が出来るようになりました
しかし解凍元と解凍先のパス指定をDOS上からパスを打ち込んで解凍できるようにしたいと思い色々と試して見ましたが、「書庫ファイルが見つかりません」や
文字列の変数が書庫ファイルに指定(s{81}.lzhが見つかりません)されていたりと
うまくいきません
何か解決策がありましたら教えていただきますようお願いいたします
1.プログラムを起動
2.解凍元の圧縮ファイルのパスを打ち込む(例:c:\MSN.lzh)
3.解凍先のフォルダのパスを打ち込む(例:c:\output\)
4.プログラム終了
なるほど 普通の宣言ではなく#define で宣言でしたか
ご教授ありがとうございました>雪影さん
BUF_LENはあのコードの前(#includeの後くらい)に
#define BUF_LEN 1024
のように指定しておくと、バッファのサイズを変える必要があるときに
宣言とサイズ指定の部分を同時に変更できて楽なのでこう書いてました。
宣言してない識別子を使って混乱させてしまってすいません。
>>松ちゃんさん
>exact
あ、間違っちゃいました。自分のプログラムの中ではextractだったんですが。
ご指摘ありがとうございます。
文字0x81・0x40のエラーについては改善されました
お騒がせしました
BUF_LENのエラーはBUF_LENの代わりに64*1024とバッファサイズを指定したら
ちゃんと解凍してくれました
これでいいのかな?(^^;)
お騒がせしてすいませんでしたm(_ _)m
雪影さん、松ちゃんさんご教授ありがとうございました
返事が遅れてすいませんでした
雪影さんに教えてもらった具体例を入れてみたんですが
「BUF_LENが定義されてない識別子です」というエラーが発生したので
BUF_LENを定義したら今度はサイズエラーとなってしまいました
BUF_LENが定義されてない影響か、
・文字0x81・0x40が認識できない
・BUF_LENの引数依存の照合を使用しても見つかりません
というエラーも出てしまいます
色々と参考書を調べたりヘルプを見ましたがエラーが改善されません
何かインクルードする必要とかあるんでしょうか?
現在、インクルードしてるヘッダ
#include "stdafx.h"
#include <windows.h>
何か解決策がございましたらご教授いただけますようお願い申し上げます
>虎壱さん
雪影さんがお書きになられたとおり、命令、オプション、解凍するファイル、解凍先
などを取得してUnlha()を実行すればOKです。
フォルダ情報も再現したい場合は「x」命令を使うことで再現可能です。
char cmdStr[]="x \"c:\\test.lzh\" \"c:\\\" \"*.*\"";
>雪影さん
虎壱さんの質問へのご回答ありがとうございました。
ちなみに、解凍処理のメッセージはExact(正確)ではなくExtract(抽出)ですね。
>虎壱さん
私も下の問題が解決してようやく解凍部分にまで進みました。
この後のプログラムは、
1. 必要な情報(解凍元、解凍先、必要ならオプション設定や解凍するファイル)を取得。
2. Unlhaを使用して解凍。
で良いと思います。具体的には
char cmdStr[]="e \"c:\\test.lzh\" \"c:\\\" \"*.*\"";
char resBuf[BUF_LEN];
int resultCode=Unlha(NULL, cmdStr, resBuf, BUF_LEN);
if(resultCode==0) printf("Exact Success");
else {
//解凍に失敗したとき
}
とかやるといいんじゃないでしょうか。この例では解凍元「c:\test.lzh」から解凍先「c:\」に、test.lzh内の
全てのファイル(*.*)を解凍する事になります。ディレクトリ構造は再現されないけど。
cmdStr内の最初のeはexactのeで解凍処理を関数にやらせることになります。このほかの処理やオプションについてはヘルプを見てください。
始めましてこちらのページを参考にしてDLL使ったDOS上で動く解凍ツールを作っている
虎壱と申します
初めてプログラムをしている物で初歩的な質問で申し訳ございませんが
UNLHA32.dllの読み込みに成功しAPI関数のアドレスを取得するところまでは
出来たのですがその後の解凍処理の命令、解凍元・解凍先のパス指定が
いまいちよくわかりません
どうかご教授していただけますようお願い申し上げます
(C++.NETを使用しています)
//書庫操作のAPI関数
typedef int(WINAPI *UNLHA)(const HWND, LPCSTR , LPSTR , const DWORD);
// LoadLibraryでDLLを開きます。(DLLの読み込み)
lib = LoadLibrary("UNLHA32.dll");
//APIへのアドレスを取得
UNLHA Unlha = (UNLHA)GetProcAddress(lib,"Unlha");
この後どういうプログラムを入れればいいかよくわかりません(^^;)
>松ちゃんさん
言われたとおり一旦クローズしてから再度オープン、FindFirstでうまくいきました。
UnlhaやUnrarではクローズせずにやってうまくいっていたので気づきませんでした。
助言どうもありがとうございました。
>雪影さん
強制終了するのはUnZipCloseArchive()で書庫を閉じずに再度UnZipFindFirst()
を実行したためだと予測されます。
2度目のUnZipFindFirst()を行う前に一度UnZipCloseArchive()で書庫を閉じて、
再度UnZipOpenArchive()で開き直してから実行してみてください。
はじめまして。総合アーカイバのDLLを用いた解凍ソフトを作っている雪影といいます。
初歩的な質問で申し訳ないんですが、UnZip32.dllについて、以下のの処理を
行った時に強制終了されてしまいます。
1. LoadLibraryでUnZip32.dllをロード
2. OpenArchive,CheckArchive,FindFirst,FindNext,GetFileName,
CloseArchiveのエントリを取得
3. 書庫をオープン、FindFirst,FindNext,GetFileNameで書庫内のファイルの名前を取得
4. 3.で取得したファイルの名前でFindFirstを行う
ディレクトリ構造を保持している書庫で、深いところにあるファイル(1段以上)をFindFirst
しようとすると強制終了になるみたいです。
対処法としてはもう一回「*」で最初からFindFirstして調べていくしかないんでしょうか。
長くなりましたが解決方法を知ってらっしゃる方、よろしくお願いします。
>SRさん
-gw3スイッチと-gw4スイッチの違いは設定ダイアログの省略を行うか行わないかの違いで、$ファ
イルを事前に作成している場合は、-gw4スイッチで省略してかまいません。
最近の版のUNLHA32.DLLは自己解凍書庫自体が簡易インストーラ化されているので、$ファイル
を良く使われる機会が多くなってきました。オンラインソフトの配布などに$ファイルを使えば毎
回入力する手間も省けて便利です。
$ファイルの設定はUNLHA32.DLLに同梱のINFCOM.TXTにあります。
自己レスです。
書庫に”$”とだけ書いたファイルを設定することで、できるんですね。
お騒がせしました。
UNLHA32.DLLを使用して、自己解凍書庫を作成しています。
ウィンドウタイトルの設定等をコマンドで渡す方法が判りません。
-gw3を付けると設定ダイアログが出るようですが、-gw4で渡す方法がわかりません。
あと”$ファイル”が判りません。
ご教授ください。
>ボブチャンチンさん
多分、解凍の際にフォルダを作ってその中にファイルを解凍したいという要望だ
と思いますが、通常圧縮するときに、「a -r1d1 test1.lzh "target\" "*.*"」
で圧縮すると、圧縮ファイルがあるルートが基準になるので、解凍でtargetと加
えないととフォルダは作成されませんが、「a -r1d1 test1.lzh "target\*.*"」
とスペースを詰めると、解凍の際にtargetというフォルダが作成され、その中に
ファイルが解凍されると思います。
よろしくお願いします。
初めて投稿します、ボブチャンチンです。
DUNLHA32のDLLを利用してVBによるAP作成を考えてます。
条件が自己解凍形式&ディレクトリ構成情報を付加する
という内容です。
試験的にディレクトリ構成情報付きのLZH形式で圧縮後、
Sコマンドで自己解凍形式に圧縮してみました。
ところが実際自己解凍を行いそのディレクトリを確認する
と本来のディレクトリ(構成情報)で無くLZH形式から自己
解凍形式のファイルを作成したディレクトリになってます。
LZH作成時に付加した構成情報のディレクトリに復元した
いのですが何か方法があるのでしょうか?
是非良いお知恵をお貸し下さい。
松ちゃん様、レスありがとうございます。
>たしかじゃじゃびーで見かけたことがありますね。
そんなこと覚えていて下さったんでっすか?! こちらがびっくりしてしまいました。
「じゃじゃびー」懐かしいでっす♪ 自分単行本派なのであのディープなお話に加われず、いつも壮大なコメントツリーが伸びていくのだけを眺めてました(苦笑)。
私も全然『めぞん〜』世代ではないでっすが、たまたま『じゃじゃグル』を読み始める以前に『めぞん〜』を読む機会があったため、渡会家に「千草」「二階堂」といった名前が出てくるたびにニヤニヤしてましたよ。
>ついんPさん
はじめましてというか、たしかじゃじゃびーで見かけたことがありますね。
>高橋留美子『めぞん一刻』に元ネタ多数
登場人物の名前の由来ですが、自分自身が「めぞん一刻」の世代でないこともあって
調査がむずかしいですね。(漫画には目を通しましたが)
知り合いのサイトで知ったのだが、こんなものまで存在しているとはすごい。
>梅ちゃんの馬券成績までお調べになるなんて…感動しました!(笑)
梅ちゃんの馬券成績はわかっている分だけをピックアップしてみました。
現在はじゃじゃグルに登場した競走馬と同名の実在の競走馬を中心に追いかけています。
現在はエニウェイゴーズとアルビレオが登録されています。
はじめまして。
「じゃじゃ馬グルーミン★UP!」に関する考察、すごいでっすね!
梅ちゃんの馬券成績までお調べになるなんて…感動しました!(笑)
ぜひ登場人物の名前の由来集も作ってください!
UnlhaSetCursorMode で出来ました。
マウスポインタをキーワードに検索したため、
見つけられませんでした。
Terryと申します。
お世話に成ります。
現在、UNLHA32.DLLを利用させていただき、膨大なWORDファイルやEXCELファイルを
圧縮したり解凍して文書を取り出したりするアプリを自作しています。
そこでお聞きしたいのですが、保存する時などにマウスポインタを自作のものを表示
しているのですが、それがUNLHAをコールした瞬間にストップウォッチの変わって仕舞います。
たぶんオプションで出来るかと思うのですが、見つけられませんでした。
ご存知でしたら、お教え頂きたいと思います。
松っちゃん@店長様。
> 調べてみたところ、通常のVisual Basicとは違い、ウインドウのハンドルが指定できない
そうだったんですか。。
>ようなので、0とするか、vbNull+"-gq"スイッチで対処できると思います。
vbNull+"-gq"スイッチでやってみる事にします。
初心者の質問に答えてくださり、本当にありがとうございます。
これからも勉強になるHPをよろしくお願いいたします。
>santaさん
RARは、データを修復するレコードを圧縮時に組み込むことができますが、UNRAR32.DLL(UNRAR.DLL)
では対処できないようなので、本家のWinRARを使うことをお勧めします。
>maさん
解凍状況を最前面に押し出すスイッチは"-gp"ではなく"-gq"スイッチになります。
>「ohwnd」にファンクション名を入れたら
>ちらつかず解凍状況画面がでてうまく行ったんですが、
>これってあっているのでしょうか?
この場合、ファンクション内での実行で、FileMeltyには何の数値も入っていないので、
hwndに0を入れているのと同じになります。
調べてみたところ、通常のVisual Basicとは違い、ウインドウのハンドルが指定できない
ようなので、0とするか、vbNull+"-gq"スイッチで対処できると思います。
なお、"-n"スイッチは解凍状況画面を表示しなくなります。
松っちゃん@店長様。
>-gqスイッチを使えば、UNLHA32.DLLの解凍状況画面を最前面にすることができるので、
-gpスイッチじゃなくって、
「ohwnd」にファンクション名を入れたら
ちらつかず解凍状況画面がでてうまく行ったんですが、
これってあっているのでしょうか?
Public Function FileMelty() As Integer
'解凍中ウィンドウは表示
ohwnd = FileMelty
lRes = Unlha(ohwnd, "e -y -c " & Chr(34) & strlxhFile & Chr(34) _
& " " & Chr(34) & strFile & Chr(34), Ret, Len(Ret))
End Function
ohwnd = vbNull
ちなみに、↑こっちで、上と同じスイッチで実行すると
解凍状況画面はでず、ちらつきます。
ohwnd = FileMelty で、上のコードに-nスイッチをつけると
ちらつかず解凍状況画面は出ないのですが、-nスイッチと-gpスイッチの
違いってなんですか?
申し訳ございません、助けてください
圧縮されたデータを解凍が出来ません、データーの一部でも解凍が出来ればうれしいのですが
データ拡張子RAR、 解凍ソフトNOAH、データー量600〜700MB HD空き5GB
解凍すると、解凍できませんでした、壊れています。とメッセージが出ます
このような時、壊れていても無理やり解凍することが出来るのでしょうか
もし出来るのであれば教えてほしいのですが、よろしくお願いします。
どうも。
>maさん
エクセルVBAから実際に実行したことはないのですが、画面がちらつくのでしたら、
-gqスイッチを使えば、UNLHA32.DLLの解凍状況画面を最前面にすることができるので、
ちらつきをなくすことができると思われます。
もし、それで解決できなければ、メールにエクセルのファイルを添付していただければ
幸いです。
はじめまして。初めてDLLを使用してみたんですが、
わからないことが多く、沢山ココのHPで沢山勉強させていただきました。
そして・・あつかましくも質問なんですが。。
エクセルVBAからのunlha32.dllの呼び出しで
ファイルの解凍をしています。が!!!
すごく画面がちらつきます。
普通の圧縮解凍ツールだと画面のちらつきなんてありませんよね。
なんかパラメーターなりスイッチなりがあるんでしょうか?
もしおわかりになりましたらお願いします。
チャレンジしてみます。
有り難う御座いました。m(_ _)m
>winさん
まず、AフォルダとDフォルダがCドライブにあったと仮定します。Aフォルダの中にあるBフォル
ダを圧縮するときは、基準フォルダを「C:\A\」として、圧縮対象を「B\*.*」と指定します。
ZIP32.DLLでコマンドラインで表すと「-r test.zip "C:\A\" "B\*.*"」となります。
その圧縮したファイルを解凍するDフォルダへは、基準フォルダを「C:\D\」とし、解凍対象
を「*.*」(全ファイル解凍)とすると、Dフォルダ内にBフォルダごとファイルが解凍されます。
UNZIP32.DLLでコマンドラインで表すと「-x test.zip "C:\A\" "B\*.*"」となります。
コマンドラインの詳細は
http://www.geocities.co.jp/SiliconValley-SanJose/1892/pc/arc_cmd.html
に詳しく書いていますのでご覧下さい。
初めて書き込みいたします。
サンプルにあった「ファイル圧縮・解凍用サンプルアプリ2」を利用させて頂いています。
勝手に頂きまして、申し訳ありません。
そこで、1つ初歩的だとは思うのですが質問をお願いいたします。
例えば、Aフォルダの下にBフォルダが有り、その配下にhtmlファイルやjpgファイルが有ります。
これをBフォルダ以下を圧縮し、解凍の際には、Dフォルダ配下を指定すると自動的にBフォルダを作成し、その配下にhtmlファイルやjpgファイルが解凍されるようにしたいのですが、ZIP32jのスイッチオプション等を調べたのですが、良く分かりません。
スキルの無い私に、ご教授頂けると助かります。
すいませんが、宜しくお願いいたします。
店長 金杯は 惨敗でした←面白くない洒落
で 土曜の万葉Sでやっと獲れました。
結構 得意なんだ長いレースって・・・・
で 日曜は、買い忘れて 没 ガーネット(ニホンピロサート)も
シンザン(サイレントディール)も
予想通りだったのに・・・。
ニホンピロサートはフェブルラリSに行くんだろうな
サイレントディールは、去年のタニノギムレットみたいにスプリングSかな?
勝手に思う
しかし 携帯から買えるのに忘れるなんて
あたしって 馬鹿
来週の日経新春杯はトシザブィから
京成杯はわからんな良い馬あります?
(強いて言えばブラックカフェかな)
Unimp32.dllでの解凍処理でも7-zipと同様の現象が起こってました。
これもやはり先頭のオプションスイッチごと""で囲む形に書き換えると
正常に動作しましたので、ご報告まで(^^A;
オプションスイッチごと""で囲むとは思いもよりませんでした。
確認してみた所、正常に動作しました。
素早い的確なアドバイス、本当にありがとうございました(^^)
遅くなりましたが、あけましておめでとうございます。
>もんさん
金杯の結果はどうでしたか?
月曜日は中山で144万馬券出ましたからね。
>ついんさん
不具合報告ありがとうございます。確認したところ、7-zip32.dllの仕様で
「x "C:\My Documents\Test1.7z" -o"C:\My Documents\Test1" *.*」
ではエラーになってしまいます。この場合は
「x "C:\My Documents\Test1.7z" "-oC:\My Documents\Test1" *.*」のように
スイッチごと""で囲こむことで問題無く解凍できます。
また、フォルダおよび複数ファイルの圧縮処理で""が抜けていた分
も修正しましたので、明日にでも修正版をUPさせていただきます。
WindowsXP Pro,VB6.0で作成してます。
7-ZIPの解凍を行う上での質問なのですが、サンプルプログラムを使用して解凍そのものは
正常に行われるのですが、フォルダ名等にスペースが含まれている場合の動作が
どうもうまくいきません。
"-o"スイッチの後に解凍先フォルダを指定するようになっていますが、この
解凍先フォルダ名の中にスペースがあると一番先頭のスペース部分までをフォルダ
と認識してスペースより後ろはカットされた状態で解凍が行われます。
7-ZIP圧縮ファイルを"C:\Documents and Settings\ついん\My Documents\My_Data\"に
置いて解凍処理を行うと"C:\Documents\"を自動作成してそのフォルダの中に
解凍が行われます。
ただし"C:\Documents and Settings\ついん\My Documents\My_Data\"内に圧縮
ファイル名と同名の中身が空のフォルダは作成されます。
"-o"スイッチの後ろのフォルダ指定部分を""で囲めば良いと思いやってましたが、
これをやると解凍処理中にエラーが発生します。(Error Code:0x8102)
''でも同じ結果でした。
色々ネットで検索してみましたがわかりませんでした・・・
何か良い方法をご存じでしたらご教授願いますm(_ _)m