![]() |
![]() |
Автозапуск и авто завершение 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> |
