Автозапуск и авто завершение Visual FoxPro WWW Data Server |
При использовании Microsoft Visual FoxPro 6.0 WWW Search Page Wizard имеется одна небольшая проблема, заключающаяся в необходимости ручного запуска WWW Data Server, обслуживающего обработку данных, передаваемых через рабочие файлы из Vfpcgi.exe. В данной заметке показывается, как можно устранить эту проблему. Для этого необходимо внести ряд изменения в файл Mycgi.c (…Vfp98/Tools/Inetwiz/Server/Mycgi.c), в экранную форму Server.scx (WWW Data Server) и файл Server.prg из проекта Server.pjx (…Vfp98/Tools/Inetwiz/Server/Server.pjx), обеспечивающих авто запуск WWW Data Server при получении запроса к данным и его авто завершение, когда время простоя WWW Data Server превысит некоторый заранее заданный интервал.
Для обеспечения автозапуска WWW Data Server следует произвести следующие изменения:
... #include <sys/timeb.h> #include <process.h> #include <tchar.h> ... #define SERVER_NODATA_TEXT_LOC "A server error occurred. No return data was sent." #define WINVFPDATASERVER "WWW Data Server" #define PRGVFPDATASERVER _T("C:\\Program Files\\Microsoft Visual Studio\\Vfp98\\Tools\\Inetwiz\\Server\\Server.exe") void errorform( char *errorstring, char *errortitle ); BOOL IsVfpDataServer(); BOOL DoVfpDataServer(); ... fpos_t pos; // Check and start VfpDataServer if (!IsVfpDataServer()) DoVfpDataServer(); ... BOOL IsVfpDataServer() { return (FindWindow(NULL, WINVFPDATASERVER) != (HWND)NULL); } BOOL DoVfpDataServer() { BOOL bRetVal = FALSE; BOOL bResetDir = FALSE; TCHAR szCurDir[MAX_PATH]; TCHAR szTmpDir[MAX_PATH]; if (GetCurrentDirectory((DWORD)MAX_PATH, szCurDir) && GetTempPath((DWORD)MAX_PATH, szTmpDir)) bResetDir = SetCurrentDirectory(szTmpDir); bRetVal = _tspawnl(_P_DETACH, PRGVFPDATASERVER, PRGVFPDATASERVER, NULL) != -1; if (bResetDir) SetCurrentDirectory(szCurDir); return bRetVal; }
Для исключения сообщения об ошибке при попытке передачи значений параметров из родительского процесса, следует добавить три формальных параметра (непосредственно в программе передаваемые значения не используются):
... #DEFINE ERRREC_LOC "Record number : " LPARAMETERS tuUnk1, tuUnk2, tuUnk3 LOCAL lcProgram,lcFullPath,lnAtPos,lcFoxTools,lcError,lcFileName ...
Для обеспечения авто завершения WWW Data Server в форму Server.scx следует добавить новое свойство nLastEndProcess с значением по умолчанию 0. Далее необходимо внести следующие самоочевидные изменения:
ThisForm.nLastEndProcess = SECONDS()
#DEFINE C_TIMEOUTSERVER_LOC 300 &&<- WWW Data Server timeout #DEFINE C_ADDPROCESS_LOC "Adding process " ... IF EMPTY(lcFileName) * Check Server timeout IF SECONDS()-ThisForm.nLastEndProcess > C_TIMEOUTSERVER_LOC ThisForm.cmdCancel.Click() ENDIF * Nothing waiting. Use normal delay. IF THIS.Interval != NORMAL_INTERVAL THIS.Interval = NORMAL_INTERVAL ENDIF RETURN ENDIF ... ThisForm.nLastEndProcess = SECONDS()
Функция DoVfpDataServer запускает сервер скрытно, в связи с эти могут возникнуть проблемы:
Проблема | Решение |
Недоступен протокол событий на сервере WWW Data Server | Обеспечьте дополнительно ведение файла протокола событий |
Невозможно экстренно завершитьWWW Data Server из Windows NT Task Manager | Определив из диалога Windows NT Task Manager PID процесса для WWW Data Server, выполните системную утилиту Kill.exe <PID> |