![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OneInstance, но не простой... [D6, Win2k]
LordOfSilence © (2002-11-18 13:56:00)Коллеги, подскажите, пожалуйста, а то что-то ничего
путного в голову не идет.
Описываю ситуацию:
В свою время мой шеф поставил мне задачу по написанию
небольшой проги-утилитки. Если кому интересно - сбор
данных с COM-порта и ведение логов. Сейчас эта прога
мирно сидит в систрее нашего сервера и тихонько ведет
свою работу в фоновом режиме. По сути задачи посчитал
необходимым реализовать OneInstance. Сделал это через
Mutex. Если будет необходимо - выложу кусок исходного
кода. До этого момента все было в порядке и проблем не
возникало. Но!...
Мой шеф - весьма продвинутый малый и любит лезть на
сервер через терминальный доступ, для чего использует
Citrix. Так вот, когда он коннектится к серверу, то
моя программа стартует (в его терминальной сессии),
так как ярлык прописан в папке автозагрузки, и...
НЕ НАХОДИТ первый экземпляр, который уже сидит в систрее,
при этом ругается на то, что COM-порт уже занят, после
чего главное окно приложения пропадает, но само приложение
остается висеть в списке процессов сервера, в чем мы
убедились, просмотрев список этих процессов на самом сервере.
То есть, как я понимаю, в этом случае запускаемые задачи разносятся по разным "пространствам" и Mutex не ловится.
Как посоветуете решать эту нестыковку? Проверять при старте
состояние COM-порта (хоть убей, но почему-то этот способ
мне не кажется "изящным") или тупо создавать некий внешний
файл "блокировки", который будет создаваться при старте
первого экземпляра и уничтожаться соответственно только
при его завершении, а во втором проверять его существование?
А может быть существует другой оригинальный способ,
о котором я и не подозреваю?
Помогите, пожалуйста, разрулить эту ситуацию, а то у меня
сегодня "синий понедельник"...
LordOfSilence (2002-11-18 14:33:00) [21]Про сервис думал. Но это переписывать надо.
Не все, конечно, но пальчикам придется попорхать :)
Хотел отделаться "легким испугом".
program ComLog;
uses
Forms,
Windows,
SysUtils,
main in "main.pas" {frmMain},
setup in "setup.pas" {frmSetup},
engine in "engine.pas";
var
Mutex : THandle;
IsPrevInst : boolean;
PrevInst : hWnd;
{$R *.res}
begin
Mutex := CreateMutex( nil, False, "ComLogMutex" );
if Mutex <> 0 then begin
if GetLastError = ERROR_ALREADY_EXISTS then begin
IsPrevInst := True;
CloseHandle( Mutex );
end
else IsPrevInst := False;
end
else IsPrevInst := False;
if not IsPrevInst then begin
Application.Initialize;
Application.Title := "Утилита ведения логов COM-порта";
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TfrmSetup, frmSetup);
Application.Run;
end
else begin
PrevInst := FindWindow( ClassName, AppTitle );
if PrevInst <> 0 then PostMessage( PrevInst, UM_APPRESTORE, 0, 0 )
end
end.
han_malign (2002-11-18 14:29:00) [22]Mutex - именованный?
sndanil (2002-11-18 14:26:00) [23]а про сервис ты не думал?