C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VB フォルダ監視


(過去ログ 95 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■56778 / inTopicNo.1)  VB フォルダ監視
  
□投稿者/ あらぽん (5回)-(2011/01/31(Mon) 18:16:02)

分類:[.NET 全般] 

いつもお世話になっています。

タイトルにあるとおり、VBでフォルダ監視を行い新しいファイルが作成されると処理をするプログラムを作成しているのですが、詰まってしまいました。
現象はWaitForSingleObjectに処理が入った後に、ファイル追加しても反応がなくタイムアウト時間が過ぎても戻ってこない状態です。

■開発環境
  windows xp professional 32bit sp3
  Visual Studio 2008 Express Edition

----------------- ココからソース ----------------- 
Public Class Form1

    Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
    Private Declare Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
    Private NotificationHandle As Long

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

         NotificationHandle = FindFirstChangeNotification("D:\TEST", False, FILE_NOTIFY_CHANGE_FILE_NAME)
         If NotificationHandle = INVALID_HANDLE_VALUE Then
            MsgBox("Error")
            Exit Sub
         End If
        
        Dim RetCode As Long

        RetCode = WaitForSingleObject(NotificationHandle, 5000)
        If RetCode = WAIT_OBJECT_0 Then
            Call MsgBox("NoData")
        End If
    End Sub
End Class
----------------- ココまでソース ----------------- 

何回も見直したのですが毎回同じ見方しかできず自分で間違いを探しきれない状態です。
お分かりの方、情報お願いします。

引用返信 編集キー/
■56779 / inTopicNo.2)  Re[1]: VB フォルダ監視
□投稿者/ Hongliang (753回)-(2011/01/31(Mon) 18:24:15)
> windows xp professional 32bit sp3

> Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
> Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
> Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
> Private Declare Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
> Private NotificationHandle As Long

取り敢えず、32bit プロセスならハンドルの類は Long じゃありませんし、そもそも .NET には FileSystemWatcher クラスが用意されていますが……。
引用返信 編集キー/
■56783 / inTopicNo.3)  Re[2]: VB フォルダ監視
□投稿者/ あらぽん (6回)-(2011/01/31(Mon) 20:11:43)
Hongliangさんご返答ありがとうございます。

フォルダ監視にFileSystemWatcherを使ったバージョンも作ってみてそちらは問題なく動作しました。
ただFindFirstChangeNotificationも使ってみたく、実装したところ思った動作にならなく質問をしました。

> 取り敢えず、32bit プロセスならハンドルの類は Long じゃない
勉強不足で申し訳ないです。インターネットで調べたページを参考に組んでたのでそのままLong良いと思ってました。
見たページが64bitの解説だったのかもしれません。
bit数を意識して調べるようにします。

引用返信 編集キー/
■56787 / inTopicNo.4)  Re[3]: VB フォルダ監視
□投稿者/ Azulean (682回)-(2011/01/31(Mon) 23:00:42)
No56783 (あらぽん さん) に返信
> 勉強不足で申し訳ないです。インターネットで調べたページを参考に組んでたのでそのままLong良いと思ってました。
> 見たページが64bitの解説だったのかもしれません。

そうではなく、VB6 向けのサンプルコードだったのでは?
VB6 時代と今の VB.NET では型が表す範囲が違います。また、.NET では IntPtr というポインタを表す型が用意されているので、ポインタやハンドルを表す引数はそちらで書くことが望ましい状態です。
引用返信 編集キー/
■56823 / inTopicNo.5)  Re[4]: VB フォルダ監視
□投稿者/ あらぽん (7回)-(2011/02/01(Tue) 22:06:45)
Azuleanさんご返答ありがとうございます。

> そうではなく、VB6 向けのサンプルコードだったのでは?
> VB6 時代と今の VB.NET では型が表す範囲が違います。また、.NET では IntPtr というポインタを表す型が用意されているので、ポインタやハンドルを表す引数はそちらで書くことが望ましい状態です。

VBと.netはそんなに変わらないだろうと思い込んでいました。
ビット数意識してintとかlong使い分けるのではなく、IntPtr使うようにします。


IntPtrと言うヒントを元に調べていくとHongliangさんが他の質問ページで答えられていますね。
わんくま外でもお世話になりましたm(_ _)m

プログラムの知識云々よりも調べる力なんとかしないと・・・
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -