45
Автозапуск и авто завершение
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 превысит некоторый заранее заданный интервал.

В начало

Изменения в Mycgi.c:

Для обеспечения автозапуска 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;
}

Пояснения к изменениям в Mycgi.c:

В начало

Изменения в Server.prg:

Для исключения сообщения об ошибке при попытке передачи значений параметров из родительского процесса, следует добавить три формальных параметра (непосредственно в программе передаваемые значения не используются):

...
#DEFINE ERRREC_LOC "Record number : "
LPARAMETERS tuUnk1, tuUnk2, tuUnk3
LOCAL lcProgram,lcFullPath,lnAtPos,lcFoxTools,lcError,lcFileName
...
В начало

Изменения в Server.scx:

Для обеспечения авто завершения WWW Data Server в форму Server.scx следует добавить новое свойство nLastEndProcess с значением по умолчанию 0. Далее необходимо внести следующие самоочевидные изменения:

В метод Init:

ThisForm.nLastEndProcess = SECONDS()

В метод Timer1.Timer:

#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>
 
 
Hosted by uCoz