• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SHFileOperationについて)

SHFileOperationについて

このQ&Aのポイント
  • APIのファイルフォルダコピー関数、SHFileOperation()がエラーを発生させる原因または、回避・解消する方法を教えてください
  • VisualBasicで操作している際に、SHFileOperation()を実行するとデザイン環境または実行したexeが強制終了し、エラーメッセージが表示される問題が発生しています
  • Windows2000Pro環境では問題が起こりますが、WindowsXP環境では正常にファイルコピーが完了します

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.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の位置がずれてしまっていたため、ただしく"コピー"という文字列が取得できず、エラーとなってしまった。 ということです。 どうしてもタイトル文字列を変えたいということですと、 メンバのずれを意識して自分でアドレスの値を指定していくしかなさそうですね。

natural_aspirate
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

構造体の定義が怪しいかも。 どんな定義書いてます?

natural_aspirate
質問者

お礼

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

natural_aspirate
質問者

補足

以下、定義したい構造体です。 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"を削除してみたら不具合が起きませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A