dポイントプレゼントキャンペーン実施中!

こんにちは。
タイトルの通り、APIのファイルフォルダコピー関数に関する質問です。現在VisualBasicでの操作なので、こちらへ掲載させていただきました。
まず環境ですが、
PC:VAIOノート2001年製
OS:Windows2000Pro
外付けフロッピー(A:)ドライブ:Logitec製USBバスパワードライブ
以上の条件で、下記のロジック
Function FileCopy(frm_ctrl As Form, source As String, destination As String) As Variant
Dim lpFileOp As SHFILEOPSTRUCT
Dim lngRetValue As Long

With lpFileOp
.hWnd = frm_ctrl.hWnd
.wFunc = FO_COPY
.pFrom = source
.pTo = destination
.fFlags = FOF_NOCONFIRMATION Or FOF_NOCONFIRMMKDIR Or FOF_MULTIDESTFILES Or _
FOF_SIMPLEPROGRESS
.fAnyOperationsAborted = True
.hNameMappings = 0&
.lpszProgressTitle = "コピー"
End With
lngRetValue = SHFileOperation(lpFileOp)
If lngRetValue <> 0 Then
MsgBox "ファイルコピーに失敗しました。"
End If
AplFileCopy = lngRetValue
End Function
を実行した場合、デザイン環境または実行したexeが強制終了させられ、エラーメッセージが表示されます。
ステップインで追跡した結果、"SHFileOperation(lpFileOp)"の箇所で発生していたのですが、原因が分かりません・・・ちなみにWindowsXPで実行した場合、デザイン環境時のみエラーが発生し、実行環境では正常にファイルコピーが完了しました。
以上から、SHFileOperation()がエラーを発生させる原因または、これを回避・解消する方法をご存知の方、おられましたら、教えてください。
よろしくお願いします。

A 回答 (2件)

構造体の定義自体はあっていました。



ただ、この構造体自体が曲者で、
>fFlags As Integer '操作フラッグ(FOF_xxx)

とIntegerが1つだけいます。
普通はWinAPIで使用する構造体は、4バイト(32bit)毎に構造体のメンバが整列されているのですが、このIntegerのせいで、このメンバ以降のメモリ上の位置がずれてしまっています。

VB6では自動的に4バイトの位置にメンバの位置を合わせてしまうため、VBで定義した構造体と、APIが要求する構造体の定義に違いが出てきてしまい、エラーが発生してしまいます。

>ちなみに、4つ目の操作フラグの"FOF_SIMPLEPROGRESS"を削除してみたら不具合が起きませんでした。

構造体の一番最後のメンバであるlpszProgressTitleは、
FOF_SIMPLEPROGRESSを指定したときのみ参照されます。
つまり、FOF_SIMPLEPROGRESSが指定されたときに、
lpszProgressTitleをAPI内部で参照しに行ったが、
構造体のアライメントの関係でlpszProgressTitleの位置がずれてしまっていたため、ただしく"コピー"という文字列が取得できず、エラーとなってしまった。
ということです。

どうしてもタイトル文字列を変えたいということですと、
メンバのずれを意識して自分でアドレスの値を指定していくしかなさそうですね。
    • good
    • 0
この回答へのお礼

takat_tetsuさん、ご回答ありがとうございます。
原因を理解できました。結果としてはVB6でのプログレスバー付き(及びタイトル付き)の使用を避けようと思います。今後もAPI使用時は引数の4バイトは意識しておいた方が良さそうですね。プログレスバーはまた別オブジェクトでも作成してみます。
お忙しいところ、ありがとうございました。感謝します。

お礼日時:2004/09/15 14:44

構造体の定義が怪しいかも。


どんな定義書いてます?

この回答への補足

以下、定義したい構造体です。
Type SHFILEOPSTRUCT
hWnd As Long 'ウインドウのハンドル
wFunc As Long '操作方法
pFrom As String   '操作元のファイル名・ディレクトリ名
pTo As String '操作先のファイル名・ディレクトリ名
fFlags As Integer '操作フラッグ(FOF_xxx)
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End Type
ちなみに、4つ目の操作フラグの"FOF_SIMPLEPROGRESS"を削除してみたら不具合が起きませんでした。

補足日時:2004/09/15 09:09
    • good
    • 0
この回答へのお礼

taka_tetsuさん、ご指摘恐れ入ります。
補足にて記述いたします。

お礼日時:2004/09/15 09:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!