SHFileOperationについて


SO  2005-01-28 02:13:41  No: 88055

VB.NETについて教えてください!
今、VB.NETでAPIのSHFileOperationを使用してファイル処理をしようと考えているのですが、うまく動きません。
なぜかデバッグモードでステップごとに追っていくと動き、
デバッグなしで動作させようとするとMsgBoxが表示されます。
「ファイルをコピーできません。送り側のファイルまたはディスクから読み取れません。」と言うものです。
コピーされませんという事は関数自体は動いてるような気はするのですが…。
よろしくお願いします!


Dental  2005-01-28 02:56:19  No: 88056

これだけで判断するのは難しいですよ……。

せめて、構造体定義、関数定義も含めた
「再現可能なコード」を提示していただけませんか?


SO  2005-01-28 03:06:27  No: 88057

すいません。素人なもので…

<モジュール部分>
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer

Private Structure SHFILEOPSTRUCT
  Dim hWnd As Integer
  Dim wFunc As Integer
  Dim pFrom As String
  Dim pTo As String
  Dim fFlags As Short
  Dim fAnyOperationsAborted As Integer
  Dim hNameMappings As Integer
  Dim lpszProgressTitle As String
End Structure

<プログラム部分>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Ret As Integer                      '戻り値
        Dim SH As MainModule.SHFILEOPSTRUCT     'SHFILEOPSTRUCT構造体

            With SH
                .hwnd = Me.Handle             'ウインドウのハンドル
                .wFunc = FO_COPY              '操作方法
                .pFrom = "D:\TEST"            '操作元のファイル名
                .pTo = "D:\TEST2"             '操作先のファイル名
                .fFlags = FOF_MULTIDESTFILES  'フラグ
                .lpszProgressTitle = "test"
            End With
            '実行
            Ret = MainModule.SHFileOperation(SH)

End Sub

こんな感じなのですがわかりますでしょうか?
よろしくお願いします。


Dental  2005-01-28 03:53:30  No: 88058

> Private Structure SHFILEOPSTRUCT

まず、ここで問題ありますね。
StructLayout属性で、Pack:=1 を指定してください。

.NETは、基本的に 8バイトアライメントです。
一方、SHFileOperation は シングルバイトのアライメントです。
(SHELLAPI.H ファイルの先頭にある、『#include <pshpack1.h>』に注目!)

あと、各メンバにも MarshalAs をつけておいた方が良いですよ。

たとえば「BOOL fAnyOperationsAborted;」のメンバなどは、
As Integer ではなく As Boolean にして、その代わりに
<MarshalAs(UnmanagedType.Bool)> の属性をつけておいた方が
使いやすいと思いますし。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加