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 (記載なし)

PowerSpaceの運営は、パワーフューチャー株式会社が行っております。
Copyright © 2013 Power Future Co., Ltd.