Форум » [x]Harbour » Библиотека hbwin - использование wapi_FindFirstChangeNotification() » Ответить

Библиотека hbwin - использование wapi_FindFirstChangeNotification()

Петр: Впервые FindFirstChangeNotification я использовал много лет назад. Маленькая программа - сторож написанная на С следила за изменениями в почтовом ящике и при получении почты, т.е. появления в определенной входной папке файла типа #DDD_*.*, в зависимоcти от индекса пользователя ( #DDD ), переносила файл из общей папки в почтовый ящик пользователя. Прочитав соответствующий пост Андрея и посмотрев, что в MiniGUI нет подобного примера (странно, однако ), решил написать подобного "сторожа" на "чистом" Harbour, используя библиотеку hbwin.

Ответов - 8

Петр: Вот, что получилось [pre2]#include "hbwin+.ch" PROCEDURE main( cDir ) LOCAL cDirectory if hb_dirExists( cDir ) cDirectory := cDir else hb_fnameSplit( hb_dirBase(), @cDirectory ) endif if hb_dirExists( cDirectory ) if hb_fileExists( cDirectory + "quit" ) hb_FileDelete( cDirectory + "quit" ) endif ErrorLevel( WatchDirectory( cDirectory ) != 0, 1, 0 ) else ErrorLevel( -1 ) endif RETURN FUNCTION WatchDirectory( cDir ) LOCAL pChangeHandle LOCAL nWaitStatus LOCAL lRunAnyway := .t. // watch file name changes ( file was CREATED, RENAMED or DELETED) pChangeHandle := wapi_FindFirstChangeNotification( cDir, .F., FILE_NOTIFY_CHANGE_FILE_NAME ) if INVALID_HANDLE_VALUE( pChangeHandle ) ? "ERROR: FindFirstChangeNotification function failed." return wapi_GetLastError() endif // Change notification is set. Now we can wait on notification handle. do while lRunAnyway ? "Waiting for notification..." // If the function succeeds, the return value indicates // the event that caused the function to return. nWaitStatus = wapi_WaitForSingleObject( pChangeHandle, INFINITE ) switch nWaitStatus case WAIT_OBJECT_0 // A file was CREATED, RENAMED or DELETED in the directory. // _Refresh_ this directory and _restart_ the notification. RefreshDirectory( cDir, @lRunAnyway ) if lRunAnyway if ! wapi_FindNextChangeNotification( pChangeHandle ) ? "ERROR: FindNextChangeNotification function failed." return wapi_GetLastError() endif else wapi_FindCloseChangeNotification( pChangeHandle ) endif exit case WAIT_TIMEOUT // A timeout occurred, this would happen if some value other // than INFINITE is used in the Wait call and no changes occur. // In a single-threaded environment you might not want an // INFINITE wait. ? "No changes in the timeout period." exit otherwise ? "ERROR: Unhandled nWaitStatus." return wapi_GetLastError() endswitch end while RETURN 0 /*--- */ PROCEDURE RefreshDirectory( cDir,lRunAnyway ) // This is where you might place code to refresh your // directory listing, but not the subtree because it // would not be necessary. ? hb_strFormat( "Directory (%1$s) changed.", cDir ) if hb_fileExists( cDir + "quit" ) lRunAnyway := .f. endif RETURN[/pre2]

Петр: Программа, получая в качестве параметра имя существующей папки (по умолчанию папка из которой программа запущена), устанавливает обработчик событий CREATED, RENAMED or DELETED и переходит в режим бесконечного ожидания. При появлении в контрольной папке файла с именем quit, программа заканчивает работу.

Петр: Определения из "hbwin+.ch" [pre2] #define INFINITE 0xFFFFFFFF // WaitForSingleObject() returns value #define WAIT_TIMEOUT 0x00000102 #define WAIT_ABANDONED 0x00000080 #define WAIT_OBJECT_0 0x00000000 #define WAIT_OBJECT_1 ( WAIT_OBJECT_0 + 1 ) // for wapi_Find*ChangeNotification #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 #define FILE_NOTIFY_CHANGE_SIZE 0x00000008 #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100[/pre2]


Петр: Некоторые wapi функции [pre2]#include "hbwapi.h" /* HANDLE WINAPI FindFirstChangeNotification( LPCTSTR lpPathName, BOOL bWatchSubtree, DWORD dwNotifyFilter ); */ HB_FUNC( WAPI_FINDFIRSTCHANGENOTIFICATION ) { if( HB_ISCHAR( 1 ) ) { HANDLE handle; void *hText; handle = FindFirstChangeNotification( HB_PARSTRDEF( 1, &hText, NULL ), hbwapi_par_BOOL( 2 ), hbwapi_par_DWORD( 3 ) ); hb_strfree( hText ); if ( INVALID_HANDLE_VALUE == handle ) { hbwapi_SetLastError( GetLastError() ); hb_retptr( NULL ); } else { hbwapi_ret_raw_HANDLE( handle ); } } else { hb_retptr( NULL ); } } //BOOL FindNextChangeNotification(HANDLE hChangeHandle); HB_FUNC( WAPI_FINDNEXTCHANGENOTIFICATION ) { HANDLE handle = hbwapi_par_raw_HANDLE( 1 ); if( handle ) { hbwapi_ret_L( FindNextChangeNotification( handle ) ); } else { hb_retl( HB_FALSE ); } } //BOOL WINAPI FindCloseChangeNotification( HANDLE hChangeHandle ); HB_FUNC( WAPI_FINDCLOSECHANGENOTIFICATION ) { HANDLE handle = hbwapi_par_raw_HANDLE( 1 ); if( handle ) { hbwapi_ret_L( FindCloseChangeNotification( handle ) ); } else { hb_retl( HB_FALSE ); } } HB_FUNC( INVALID_HANDLE_VALUE ) { HANDLE handle = hbwapi_par_raw_HANDLE( 1 ); if ( NULL != handle ) { hbwapi_ret_L( ( INVALID_HANDLE_VALUE == handle ) ); } } [/pre2]

Dima: Петр Это в каком Harbour ? В свеже скачанном ни определений , ни таких функций нет.

Петр: Dima пишет: Петр Это в каком Harbour ? Это из личной библиотеки hbwin+ Написанная по правилам (пространство имен, приведение типов) hbwin. Исходники wapi_Find*ChangeNotification я привел. Можно включить через #pragma BEGINDUMP wapi_WaitFor* из hbwin

Dima: Теперь я понял почему плюсик тут #include "hbwin+.ch" , думал очепятка :)

Петр: hbwin лучше брать из harbour-core от Виктора. Время от времени он библиотеку обновляет. В core фактически развитие приостановилось, м.б. из-за высокой планки требований установленных таким таки Виктором.



полная версия страницы