VB.NETについて教えてください!
今、VB.NETでAPIのSHFileOperationを使用してファイル処理をしようと考えているのですが、うまく動きません。
なぜかデバッグモードでステップごとに追っていくと動き、
デバッグなしで動作させようとするとMsgBoxが表示されます。
「ファイルをコピーできません。送り側のファイルまたはディスクから読み取れません。」と言うものです。
コピーされませんという事は関数自体は動いてるような気はするのですが…。
よろしくお願いします!
これだけで判断するのは難しいですよ……。
せめて、構造体定義、関数定義も含めた
「再現可能なコード」を提示していただけませんか?
すいません。素人なもので…
<モジュール部分>
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
こんな感じなのですがわかりますでしょうか?
よろしくお願いします。
> Private Structure SHFILEOPSTRUCT
まず、ここで問題ありますね。
StructLayout属性で、Pack:=1 を指定してください。
.NETは、基本的に 8バイトアライメントです。
一方、SHFileOperation は シングルバイトのアライメントです。
(SHELLAPI.H ファイルの先頭にある、『#include <pshpack1.h>』に注目!)
あと、各メンバにも MarshalAs をつけておいた方が良いですよ。
たとえば「BOOL fAnyOperationsAborted;」のメンバなどは、
As Integer ではなく As Boolean にして、その代わりに
<MarshalAs(UnmanagedType.Bool)> の属性をつけておいた方が
使いやすいと思いますし。
ツイート | ![]() |