サポート掲示板
HOME  □ MANUAL  □ 新着記事  □ 新規投稿
ツリー表示  □ 記事全文表示  □ SEARCH  □ 過去ログ
ツリー表示

MESSAGE vb6.0作成したexeの場合、コールバックが走っていない /li (21/01/23(Sat) 21:51) [1223]
....MESSAGE Re[1]: vb6.0作成したexeの場合、コールバックが走っていない /Akky (21/01/24(Sun) 23:40) [1224]
........MESSAGE Re[2]: vb6.0作成したexeの場合、コールバックが走っていない /li (21/02/02(Tue) 11:43) [1229]
........MESSAGE Re[2]: vb6.0作成したexeの場合、コールバックが走っていない /li (21/01/25(Mon) 16:57) [1227]
............MESSAGE Re[3]: vb6.0作成したexeの場合、コールバックが走っていない /Akky (21/01/26(Tue) 01:50) [1228]
................MESSAGE Re[4]: vb6.0作成したexeの場合、コールバックが走っていない /li (21/02/03(Wed) 10:54) [1230]
....................MESSAGE Re[5]: vb6.0作成したexeの場合、コールバックが走っていない /Akky (21/02/03(Wed) 20:39) [1232]
........MESSAGE Re[2]: vb6.0作成したexeの場合、コールバックが走っていない /li (21/01/25(Mon) 10:36) [1226]
........MESSAGE Re[2]: vb6.0作成したexeの場合、コールバックが走っていない /li (21/01/25(Mon) 10:20) [1225]


親記事 / ▼[ 1224 ]
NO.1223  vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ li -(2021/01/23(Sat) 21:51:55)
□U R L/
【ソフト名】
 解凍ツールを勉強する
【バージョン】
 922002
【使用OS】
 Win7 Pro
【開発言語】
 VB6.0
【PC機種】
 Dell
【質問内容】
 お世話になっております。liです。
7-zip32.dllをご利用させていただきます。ありがとうございます。 
こちらが外国人で、日本語が下手です、申し訳ございません。
 
こちらは、指定のzipファイルをCドライブに解凍し、解凍状況を表示するようにWinFormsを作成したいです。
解凍処理は、下記の2個APIを利用します、
 ・SevenZipSetOwnerWindowExでコールバック関数を指定する
 ・SevenZipでコマンド(-hide付いた)を実行する
 ・コールバック関数で、lpEis.exinfo.szSourceFileNameから解凍状況を受け取る

問題:
debugの場合、zipファイルが解凍できて、解凍状況が受け取ることができます。⇒OK
実行ファイル(.exe)の場合、zipファイルが解凍できなく、解凍状況が受け取ることができません、エラーもないです。
ただ、SevenZipSetOwnerWindowExをコメントしたら、zipファイルが解凍できます。

ご指導、ご教授を宜しくお願い致します。




▲[ 1223 ] / ▼[ 1229 ] ▼[ 1227 ] ▼[ 1226 ] ▼[ 1225 ]
NO.1224  Re[1]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ Akky -(2021/01/24(Sun) 23:40:59)
□U R L/
その情報だけで原因を判別するのは難しいですが
SevenZipSetOwnerWindowExで指定した_lpArcProc内の変数(EXTRACTINGINFOEX)が
正常に初期化されてないのが原因ではないかと思います。



▲[ 1224 ] / 返信無し
NO.1229  Re[2]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ li -(2021/02/02(Tue) 11:43:32)
□U R L/
>原因はコールバック関数で、StrConvを利用したので、異常が発生したと分かりました。
>StrConv(lpEis.exinfo.szSourceFileName, vbUnicode)
解凍状況が文字化けなので、StrConvで文字コードをunicodeに変換します。
デバッグ時、解凍状況が表示できます。
実行ファイル(.exe)の場合、"cannot allocate required memory"のメッセージが表示されました。ただ、StrConvを使わないと、解凍状況が表示できます。

このメッセージが7zip32.dllから出しますか?何かの原因でしょうか?



▲[ 1224 ] / ▼[ 1228 ]
NO.1227  Re[2]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ li -(2021/01/25(Mon) 16:57:28)
□U R L/
原因はコールバック関数で、StrConvを利用したので、異常が発生したと分かりました。
StrConv(lpEis.exinfo.szSourceFileName, vbUnicode)

もう一つ問題ですが、コールバック関数の引数(nState)の値が0/1/2の意味が難でしょうか?



▲[ 1227 ] / ▼[ 1230 ]
NO.1228  Re[3]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ Akky -(2021/01/26(Tue) 01:50:46)
□U R L/
>もう一つ問題ですが、コールバック関数の引数(nState)の値が0/1/2の意味が難でしょうか?
これです。

--------------------------------------------------------------------------------
処理の流れ
--------------------------------------------------------------------------------
 処理される格納ファイルごとに次の1・2を繰り返す。

1.ARCEXTRACT_OPEN(3) でメッセージを送出。
  szSourceFileName に処理する書庫名が格納される。

2.ARCEXTRACT_BEGIN(0) でメッセージを送出。
  szSourceFileName, szDestFileName, ファイル属性, 更新日時が有効になる。
  最初に送信された際に dwFileSize, llFileSize ヘ処理が行われる
  ファイルの合計サイズが格納される。
(合計サイズがオーバーフローする場合は 0xFFFFFFFF(-1) を格納)
  解凍時(e,x コマンド)は他の各メンバも有効になる。
  削除時(d コマンド)は送出されず、3を処理が終わるまで繰り返す。

3.ARCEXTRACT_INPROCESS(1) でメッセージを送出。
dwWriteSize, llWriteSize にこれまで処理した合計サイズが格納される。
(dwFileSize が 0xFFFFFFFF(-1) の場合は dwWriteSize には全体の処理率を格納)
処理中のファイルの処理が終わるまで送出される。
  場合によっては送出されない事もある。

  他に処理するファイルが残っている場合は2へ戻り
  すべての処理が終了した時点で4へ。(処理状況表示を消すタイミング)

4.ARCEXTRACT_END(2) でメッセージを送出。
  lParam(_lpEis) は 0(NULL) が格納される。



▲[ 1228 ] / ▼[ 1232 ]
NO.1230  Re[4]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ li -(2021/02/03(Wed) 10:54:35)
□U R L/
test.xlsxを7zip.exeでtest.zipに圧縮して、C:\に置く。

デバッグで、解凍時、lpEis.exinfo.szSourceFileName値は「整瑳??x????????揩??0」となっています。
exeファイルで、解凍時、lpEis.exinfo.szSourceFileName値は「整瑳??x」だけになりました、後半の"????????揩??0"が切れました。
何かの原因がご存じでしょうか?

何度も質問して、申し訳ございません。



▲[ 1230 ] / 返信無し
NO.1232  Re[5]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ Akky -(2021/02/03(Wed) 20:39:38)
□U R L/
VBは使った事がないので良く分からないのですが
EXTRACTINGINFO(EX)のメンバにStringを使ってますが
これの定義の仕方ってこれで正しいのでしょうか?
ここでメモリの破壊が起きてるような気がします。
それから、文字列がUnicodeだったりASCIIだったりの変換で
何か問題が起こってるような気がします。



▲[ 1224 ] / 返信無し
NO.1226  Re[2]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ li -(2021/01/25(Mon) 10:36:59)
□U R L/
> SevenZipSetOwnerWindowExで指定した_lpArcProc内の変数(EXTRACTINGINFOEX)が
> 正常に初期化されてないのが原因ではないかと思います。
⇒EXTRACTINGINFOEXの構造体定義を追記します。

'EXTRACTINGINFO の構造
'--------------------------------------------------------
Private Type EXTRACTINGINFO
dwFileSize As Long
dwWriteSize As Long
szSourceFileName As String * 513
dummy1 As String * 3
szDestFileName As String * 513
dummy As String * 3
End Type

'EXTRACTINGINFOEX の構造
'--------------------------------------------------------
Private Type EXTRACTINGINFOEX
exinfo As EXTRACTINGINFO
dwCompressedSize As Long
dwCRC As Long
uOSType As Long
wRatio As Long
wDate As Long
wTime As Long
szAttribute As String * 8
szMode As String * 8
End Type



▲[ 1224 ] / 返信無し
NO.1225  Re[2]: vb6.0作成したexeの場合、コールバックが走っていない
□投稿者/ li -(2021/01/25(Mon) 10:20:06)
□U R L/
ご回答、ありがとうございます。
コードを追記させていただきます。
画面ボタンをクリックすると、Moduleに書いたFunAを呼び出す、
デバッグの場合、問題がないです。
実行ファイル(.exe)の場合、解凍できなく、解凍状況が受け取ることができません。

Public Function FunA(hwnd As Long, ByVal strFile As String, ByVal strDir As String) As Boolean
'解凍コマンド
cmdLine = "x " & strFile & " -o" & strDir & " -aoa -hide"

'コールバック関数の指定
blnRun = SevenZipSetOwnerWindowEx(hwnd, AddressOf callback)
'解凍
resCode = SevenZip(hwnd, cmdLine , sOutPut, 0)
FunA = True
End Function

'コールバック
Public Function CallBack(hwnd As Long, uMsg As Long, ByRef nState As Long, ByRef lpEis As EXTRACTINGINFOEX) As Long
'解凍状況表示
Form1.Label1.Caption=StrConv(lpEis.exinfo.szSourceFileName, vbUnicode)

CallBack= True
End Function

確認したいですが、
実行ファイル(.exe)の場合、解凍状況が受け取ることができない原因は何の可能でしょうか?




- Child Tree -