PB 電子会議室
発言No. | 更新日 | 題名(クリックすると発言内容と関連するコメントが表示されます) |
---|---|---|
24001 | 15/01/20 11:45:03 | RE:PB10: zip圧縮について By onoz |
24000 | 15/01/20 11:39:50 | RE:PB10: zip圧縮について By onoz |
23998 | 15/01/09 14:46:30 | PB10: zip圧縮について By adako1 |
カテゴリ:
日付:2015年01月20日 11:45 発信者:onoz
題名:RE:PB10: zip圧縮について
>UNLHA32.DLLを使用したunlha関数でのLZHでの圧縮はできましたが
>UnZip32.DLLを使用したunzip関数がうまく動作しません
>スクリプトは以下の通りです。
>エラーは、「関数が参照できませんでした」となります
>外部関数の定義の仕方、実行スクリプトは以下の通りですが、何かおかしいのでしょうか?
>
>
><外部関数の定義>
>//unlha
>function long unlha(long hwnd, string szCmdLine,ref string szOutput, long dwSize) library "UNLHA32.DLL" alias for "Unlha;Ansi"
>//unzip
>function long unzip(long hwnd, string szCmdLine,ref string szOutput, long dwSize) library "UnZip32.DLL" alias for "Unzip;Ansi"
>
><スクリプトの記述>
>LONG size
>string buffer
>size = 1024
>buffer = space(size+1)
>//unlza関数実行
>Unlha(0, "a F:\ABC.LZH F:\abc.dmp" , buffer, 0)
>//unzip関数実行
>Unzip(0, "a F:\ABC.zip F:\abc.dmp" , buffer, 0)
zip32j.dllを使用したサンプルではダメでしょうか?
<外部関数の定義>
// ZIP32Jライブラリの関数宣言
FUNCTION Boolean ZipGetRunning() LIBRARY "zip32j.dll" ALIAS FOR "ZipGetRunning;Ansi"
FUNCTION Ulong Zip(Ulong hWnd, String szCmdLine, String szOutput, Ulong dwSize) LIBRARY "ZIP32J.DLL" ALIAS FOR "Zip;Ansi"
<スクリプトの記述>
//変数宣言
String ls_prm1, ls_prm2 // "バス\ファイル名"
Integer li_ret // 戻り値
String ls_msg // エラーメッセージ
String ls_cmd // JIPコマンド
String ls_tb // タブ
time lt_start_time, lt_end_time
String ls_ok_flg
//ZIP関数パラメータ宣言
Long li_hWnd
String ls_szCmdLine
String ls_szOutput
Long li_dwSize
// 初期値セット
ls_msg = ''
ls_tb = '~t'
li_hWnd = 0
li_dwSize = 1024
ls_szOutput = SPACE(li_dwSize + 1)
ls_cmd = "-9 -v -D -j " // 基本コマンドラインセット
// コマンドライン編集
IF ab_prm3 = False THEN
ls_cmd = ls_cmd + " -m" // 元ファイルを残さない
END IF
IF as_prm4 <> "" THEN
ls_cmd = ls_cmd + " -P " + as_prm4 + " " // パスワード有り( パスワードはスペースでくくる)
END IF
/**************/
/* 引数セット */
/**************/
// 圧縮先ZIPファイル名のチェック
ls_prm1 = f_null_to_blank( Trim(as_prm1) ) // ZIPファイル名
IF ls_prm1 = '' THEN
RETURN '圧縮先のZIPのファイル名が有りません。'
END IF
// すでに圧縮先のZIPファイルが存在する場合は削除する
IF FileExists( ls_prm1 ) THEN
IF Not FileDelete ( ls_prm1 ) THEN
RETURN '既存圧縮先のZIPファイルの削除に失敗しました。'
END IF
END IF
// 圧縮元ファイル名のチェック
ls_prm2 = f_null_to_blank( Trim(as_prm2) ) // 圧縮元ファイル名
IF ls_prm2 = '' THEN
RETURN '圧縮元のファイル名が有りません。'
END IF
// タブ区切り複数ファイル名指定を '" "' で分割
ls_prm2 = f_chg_text(ls_prm2,ls_tb,'" "')
// ファイル名を”でくくる編集とコマンドの付与
ls_szCmdLine = ls_cmd + '"' + ls_prm1 + '" "' + ls_prm2 + '"'
/* ************************ */
/* ZIP32J.DLLの実行中の判定 */
/* ************************ */
lt_start_time = Now()
ls_ok_flg = '0'
IF ZipGetRunning() THEN
/* 実行中 */
DO UNTIL ls_ok_flg = '1'
/* 経過時間の判定 */
Sleep( 0.5 ) //0.5秒間隔で経過時間をチェックする(CPUに負荷を掛けないようにする為)
lt_end_time = Now()
IF SecondsAfter( lt_start_time, lt_end_time ) > 120 THEN
RETURN "120秒待っても排他ロック中の為エラー" //120秒待っても実行中!
END IF
IF ZipGetRunning() THEN
/* 実行中 */
ELSE
/* 実行終わった! */
ls_ok_flg = '1'
END IF
LOOP
ELSE
/* 実行していない */
END IF
// 圧縮開始
li_ret = Zip( li_hWnd,ls_szCmdLine,ls_szOutput,li_dwSize )
// 戻り値の判定
IF li_ret <> 0 THEN
ls_msg = 'ZIP32J.DLLの圧縮処理で失敗しました。(' + Trim(ls_szOutput) + ')'
END IF
RETURN ls_msg
※f_null_to_blank()は簡単なNullチェックしブランクに変換するだけの関数です。
※圧縮処理が実行中かのループが有ります。
二重投稿してしまいました。
ごめんなさい。
引数追加です。
//* 関数名:uf_zip( ①, ②, ③, ④ )
//*
//* 概 要: ZIP形式圧縮処理
//*
//* 引数 ①:string as_prm1 圧縮先ZIP作成ファイルパス
//*
//* ②:string as_prm2 圧縮元ファイルパス(タブで区切って複数OK ワイルドカードの'*.*'も使用可)
//*
//* ③:boolean ab_prm3 True:元ファイルを残す False:元ファイルを残さない
//*
//* ④:string as_prm4 "":ブランクはパスワード無し "文字列":パスワードを文字列で設定
//*
//* 戻り値 :string エラーメッセージ
付加情報:
PowerBuilder Version 10
Client SoftWare
OS Windows XP
DBMS その他
Browser (記載なし)
Server SoftWare
OS (記載なし)
DBMS (記載なし)
WebServer (記載なし)
Copyright © 2013 Power Future Co., Ltd.