- PR -

unlha32.dllを利用した自己解凍書庫APLについて

1
投稿者投稿内容
para06
会議室デビュー日: 2005/08/10
投稿数: 9
投稿日時: 2005-09-02 16:22
自己解凍書庫APL作成で困っています。

自己解凍書庫でかつ解凍後実行コマンドを指定するケースです。
これをVB6から作成しようとしていますが、自己解凍書庫ができるまでは、うまくいくのですが、解凍後実行コマンドのスイッチを指定しても認識されていないような動きです。(自己解凍書庫をダブルクリックで実行(解凍)後、指定したコマンド(notepad.exe)が起動しない。


コマンドは以下の通り指定しています。

Dim var As lha ←unlha32.dll(V1.98b)は既に定義済み
Set var = New lha
'まずLZHファイル
var.lha("a -gw4 -xr1 -gye<notepad.exe> -w<c:\work> C:\work\archive C:\work\csv\ *.* ")

'次に自己解凍書庫(exe)にする。
var.lha("s -gye<notepad.exe> -gw4 c:\work\archive.lzh c:\work\ ")

この手順で行っています。
上のexeを実行後、notepadが起動できればOKなのですが。

何か気づかれた点等あれば、ご指摘ください。
宜しくお願い致します。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-09-02 16:40
引用:

コード:
var.lha("s -gye<notepad.exe> -gw4 c:workarchive.lzh c:work ") 




試してませんけど、notepadの前後の<>って必要なんですか?

詳細についてはCOMMAND.TXTを参照した方がいいと思いますよ。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
para06
会議室デビュー日: 2005/08/10
投稿数: 9
投稿日時: 2005-09-02 18:21
早速のご回答ありがとうございます。

まずご指摘頂いた内容を再度確認した結果(COMMAND.TXTも再度参照)
<>で記載されているように見受けられました。
とはいえ、別の記述方法を試してみました。結果は下記のパターン全てNGでした。
NGとは解凍時に、NOTEPAD.EXEが起動されない。

”:ダブルクオゥーテーション(-gye"notepad.exe")
' :シングルクオゥーテーション(-gye'notepad.exe')
無:(-gye notepad.exe)

他に心当たりあるますでしょうか、宜しくお願い致します。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-09-02 22:32
引用:

まずご指摘頂いた内容を再度確認した結果(COMMAND.TXTも再度参照)
<>で記載されているように見受けられました。



いや。。あの。。その。。なんと言えばいいんでしょうか。
ドキュメントの読み方の話なので、どう指摘をすればいいのか困ります。

その。。文法書とかドキュメントとかの最初の方に書いてある
「凡例」とか「表記のルール」って読んだことありますか?

いやぁ、確かにドキュメントには<>が書いてありますけど、
それをそのままコマンドで使えって事なんでしょうかねぇ。。

ほかにも記載されている記号で、例えば [] って言う記号も
コマンド文字に使うようにって書いてありますか?
パラメータやスイッチの説明のところの例にそんな記号が入っていましたか?
もう一度、表記のルールを念頭に置いて、よく読んでくださいね。


次のコード(C#)で試してみましたけど、ちゃんと自己解凍式ファイルが出来て、
解凍後にもメモ帳が起動しましたよ。

参考にしてください。

コード:
namespace UNLHA32Lib
{
	/// <summary>
	/// UNLHA32 の概要の説明です。
	/// </summary>
	public class UNLHA32
	{
        [DllImportAttribute("UNLHA32.DLL",
             CallingConvention = CallingConvention.StdCall)]
        private static extern int Unlha(
            IntPtr hWnd,
            [MarshalAs(UnmanagedType.LPStr)]string CmdLine,
            [MarshalAs(UnmanagedType.LPStr)]string Output,
            uint Size
            );

        private IntPtr _hwnd = IntPtr.Zero;
		private UNLHA32(){}
        public UNLHA32(IntPtr HWND)
        {
            _hwnd = HWND;
        }

        public void CompressTo(string[] Files, string ArchiveFile, bool IncludePath)
        {
            foreach (string s in Files)
            {
                bool _includePath = IncludePath;
                FileInfo fi = new FileInfo(s);
                StringBuilder filename = new StringBuilder();
                filename.Append(s);
                filename.Insert(3, " \"");
                if ((fi.Attributes & FileAttributes.Directory) > 0)
                {
                    _includePath = true;
                    if (filename[filename.Length - 1] != Path.DirectorySeparatorChar)
                        filename.Append(Path.DirectorySeparatorChar);
                    filename.Append("*.*");
                }
                filename.Append("\"");

                StringBuilder _commandline = new StringBuilder();
                _commandline.Append("a -a1 ");
                if (_includePath) _commandline.Append("-x1 -r2 ");
                _commandline.Append("\"" + ArchiveFile + "\" ");

                int ret = Unlha(_hwnd, _commandline.ToString() + filename.ToString(), null, 0);
                if (ret != 0) throw new Exception(ret.ToString());

                _commandline = new StringBuilder();
                _commandline.Append("s -gyenotepad.exe -gw4 ");
                _commandline.Append(Path.GetDirectoryName(ArchiveFile));
                _commandline.Append(Path.DirectorySeparatorChar);
                _commandline.Append(Path.GetFileNameWithoutExtension(ArchiveFile));
                _commandline.Append(" ");
                _commandline.Append(Path.GetDirectoryName(ArchiveFile));
                _commandline.Append(Path.DirectorySeparatorChar);
                ret = Unlha(_hwnd,_commandline.ToString(),null,0);
                if (ret != 0) throw new Exception(ret.ToString());
            }
        }

	}
}



_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
para06
会議室デビュー日: 2005/08/10
投稿数: 9
投稿日時: 2005-09-05 16:46
ありがとうございました。

ご指摘頂いた内容で試し近い動きを見ることができました。
色々なご指摘ありがとうございました。

動作不良の原因は、パラメータ<>指定と、UNLHA32.DLL自体
動作がおかしかったことが挙げられます。再度ダウンロードし
入れ替えた後、ご指摘のとおり試してみると動きました。

1

スキルアップ/キャリアアップ(JOB@IT)