vfp如何创建windows服务?
最近想用vfp写一个windows服务,监视一个文件夹,如文件夹内文件增加,将新增的文件复制另一个文件夹内。不知道用vfp9.0和win7或winxp能否实现,如何实现??请各位大侠指教!!
[解决办法]
我觉得你的设想100%可以实现。VFP9在WIN8中也能很好地运行,用TIMER控件定时读取文件夹中的文件名,用第三方软件把编译成的EXE文件设定成windows 服务启动运行。
[解决办法]
请参考 夜猫 版主的文章:
创建一个作为服务运行的 vfp 程序
[解决办法]
VFP 9.0 的 Samples\Solution 目录下有个 Binding to Windows Message Events 的示例
可以实时监测文件或文件夹的事件和行为
主要的或核心语句是
BINDEVENT(_VFP.hWnd, WM_USER_SHNOTIFY, THIS, "handlewinmsg")
[解决办法]
从 Solution 示例剥离出来的代码:
Declare Long WaitForSingleObject In kernel32 ;
INTEGER hHandle, ;
INTEGER dwMilliseconds
Declare Long FindFirstChangeNotification In kernel32 STRING lpPathName, INTEGER bWatchSubtree, INTEGER dwNotifyFilter
Declare Long FindNextChangeNotification In kernel32 ;
INTEGER hChangeHandle
Declare Long GetLastError In kernel32
Declare Long FindCloseChangeNotification In kernel32 ;
INTEGER hChangeHandle
#Define FILE_NOTIFY_CHANGE_FILE_NAME 0x01
#Define FILE_NOTIFY_CHANGE_DIR_NAME 0x02
#Define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x04
#Define FILE_NOTIFY_CHANGE_SIZE 0x08
#Define FILE_NOTIFY_CHANGE_LAST_WRITE 0x10
#Define FILE_NOTIFY_CHANGE_SECURITY 0x100
#Define FILE_NOTIFY_ALL = BITOR(FILE_NOTIFY_CHANGE_ATTRIBUTES,;
FILE_NOTIFY_CHANGE_DIR_NAME,;
FILE_NOTIFY_CHANGE_FILE_NAME,;
FILE_NOTIFY_CHANGE_LAST_WRITE,;
FILE_NOTIFY_CHANGE_SECURITY,;
FILE_NOTIFY_CHANGE_SIZE)
#Define INVALID_HANDLE_VALUE -1
#Define INFINITE 2147483647
#Define WAIT_FAILED 2147483647
#Define True -1
#Define False 0
lcPathSpec = "C:\Temp" && 假设你监测 Temp 目录下的事件
lbWatchSubtree = True
* 监测在该指定的 PathSpec 目录下的文件或文件夹的增加、改名、和删除的事件
lihNotify = FindFirstChangeNotification(lcPathSpec, lbWatchSubtree,FILE_NOTIFY_CHANGE_LAST_WRITE)
* FILE_NOTIFY_CHANGE_DIR_NAME)
If lihNotify <= INVALID_HANDLE_VALUE
Messagebox ("FindFirstChangeNotification failed. Error code: " + ;
LTRIM(Str(GetLastError())))
Return
Else
* Uncomment for debugging purposes.
* MessageBox ("FindFirstChangfeNotification instantiation ;
* succeeded. Handle is: " + ltrim(str(lihNotify)))
Endif
* Now, go into a wait state.
* This is going to look like a hang, since the IDE is all in
* one thread.
liWaitReturn = WaitForSingleObject(lihNotify, INFINITE)
If liWaitReturn >= WAIT_FAILED
Messagebox ("FindFirstChangeNotification 失败,错误代码是 : " + ;
LTRIM(Str(GetLastError())))
Return
Else
* Messagebox ("在 " + lcPathSpec + " 的目录下,有事件发生!")
? "在 " + lcPathSpec + " 的目录下,有事件发生!"
Endif
liWaitReturn = FindCloseChangeNotification(lihNotify)