Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Вниз

Удаленное завершение работы приложения...   Найти похожие ветки 

 
Илайдж   (2003-10-14 10:56) [0]

Ситуация: есть несколько приложений, все запускаются с сервера.
С одним приложением могут работать сразу несколько людей в разных отделах и иногда бывает необходимо его обновить. Бегать по отделам и обзванивать, мол закройте программу на пару минут нереал по нескольким причинам.

Вопрос такой: как организовать удаленное завершение работы приложения?
Сначала была идея опрашивать таблицу MSSQL на предмет наличия инструкции - но это не очень грамотно на мой взгляд.
С сокетами тоже непонятно, ибо "клиенты" должны быть запущены БЕЗ "сервера", т.е я свою программу могу запустить а могу и не запускать...
Посоветовали использовать mailslot"ы, но по ссылкам очень мало инфы. Просьба, если кто-то в курсе этого дела, напишите кусочек кода, условно - что надо написать в приложениях, и что надо сделать в программе, которая будет приложениями управлять..
Может есть какие-то другие варианты..

Заранее спасибо.


 
Rouse_   (2003-10-14 20:32) [1]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function OpenMailSlot (const Server, Slot: String): THandle;
var
FullSlot: String;
begin
FullSlot:="\\"+Server+"\mailslot\"+Slot;
Result:=CreateFile (PChar (FullSlot), GENERIC_WRITE, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
end;

function SendBufToMailSlot (const Server, Slot: String; Data: PChar; Length:
Integer): Boolean;
var
hToSlot: THandle;
BytesWritten: DWORD;
begin
Result:=False;
hToSlot:=OpenMailSlot (Server, Slot);
if hToSlot = INVALID_HANDLE_VALUE then
Exit;
try
BytesWritten:=0;
if (not WriteFile (hToSlot, Pointer (Data)^, Length, BytesWritten, nil)) or
(BytesWritten <> Length) then
Exit;
Result:=True;
finally
CloseHandle (hToSlot);
end;
end;

function SendToWinpopup (Server, Reciever, Sender, Msg: String): Boolean;
var
S: String;

const
wpSlot = "messngr";

begin
CharToOEM (PChar (Server), PChar (Server));
CharToOEM (PChar (Sender), PChar (Sender));
CharToOEM (PChar (Reciever), PChar (Reciever));
CharToOEM (PChar (Msg), PChar (Msg));
S:=Sender+#0+Reciever+#0+Msg;
Result:=SendBufToMailSlot (Server, wpSlot, PChar(S), Length(S));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
MSopen:THandle;
ZHERTVA,USER,COMP:string;
Data:string;
Len:DWORD;
begin

ZHERTVA:=Form1.Edit1.Text;
USER:=Form1.Edit2.Text;
COMP:=Form1.Edit3.Text;
Data:=Form1.Memo1.Text;
CharToOEM(PChar(USER),PChar(USER));
CharToOEM(PChar(COMP),PChar(COMP));
CharToOem(Pchar(Data),Pchar(Data));
Data:=USER+#0+COMP+#0+Data;
Len:=Length(Data);
MSopen:=CreateFile(pchar("\\"+ZHERTVA+"\mailslot\messngr"),
GENERIC_WRITE,FILE_SHARE_READ,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if MSopen<>INVALID_HANDLE_VALUE then
begin
WriteFile(MSopen,Pointer(PChar(Data))^,Len,Len,nil);
end;
closeHandle(MSopen);
end;

end.


На стиль не обращай внимания. Писал просто для теста.
В данном случае посылается сообщение из 98 в НТ таким же образом как работает net send. Т.е. после выполнения кода в отношении НТ машины или 98 с запущеным WinPopup получим всплывающее окошко.

Желаю успехов.


 
Илайдж   (2003-10-15 08:43) [2]

Пасибо. Не совсем то, что надо, но уже есть от чего отталкиваться.


 
FoxBox   (2003-10-15 17:30) [3]

Проблему можно решить проще - есть запускальщик (маленькая прога, которая запускает основную, заодно по необходимости и обновляет версии). Вот запускальщик и стартуют юзвери. А в запускальщике можно реализовать нехитрую логику с проверкой на актуальность основного файла с последующим копированием его на машину юзверя и последующим запуском с локального диска. Никаких блокировок сорса. Выкладывай изменения в любых количествах. При следующем входе юзвери "заберут" свеженькую версию основной проги...


 
Rouse_   (2003-10-15 19:28) [4]

> Илайдж ©
Это как раз и есть майлслоты, к слову. Можно использовать и некий запускальщик по совету FoxBox, но думаю проблема будет в том что каждый пользователь может запускать разную программу (к примеру их три). Появится проблемы с сохранением результатов работы, плюк когда изменится код программы без завершения всех запущенных с сервера приложений на всех машинах их код нельзя будет заменить на самом сервере. Придется додумывать некий аварийный выход с сохранением результатов с предварительным предупреждением пользователя.
Короче поработать придется, хотя не все так страшно как видится, если программы используемые пользователями написанны собственноручно.

Желаю успехов


 
Илайдж   (2003-10-16 08:52) [5]

>> FoxBox: при следующем входе
дело в том, что все должно хранится в одном месте, без разброса по локальным дискам, + все юзера должны работать с одной версией

>> Rouse_: программы написаны собственноручно..
Еснно, иначе проблемы обновления не было бы, просто было бы как с консультант+ - приехал мальчик обновлять, все дружно закрыли программы и через час открыли...

Собственно, приведенный выше код очень интересен, НО! я не смог разобраться с обработкой ПОЛУЧЕННЫХ сообщений...=(
Насчет аля net send очень хорошо, но тока если пользователи не включили программу и не пошли попить чай на часик..можно обспамиться - толку 0 (посему и непосредственный звонок с просьбой закрыть программу не идеален)

Посему интересна обработка сообщений скажем так в фоне работы, т.е получил сообщение, обработал - и выдаешь окно, в котором написано, что в течение минуты программа будет закрыта либо кликни ok для немедленного закрытия. Вот это то что реально нужно.

Я так понимаю, мейлслот должен быть вида
\\ + [ComputerName] + \mailslot\ + [programID]
Слот создается <более-менее :D> нормально

Как обрабатывать мессаги?
Если дадите пример GetMailSlotInfo, который чудесно обработает
вышеприведенную
function SendBufToMailSlot (const Server, Slot: String; Data: PChar; Length:Integer): Boolean;
- буду весьма и весьма...
Сорри за назойливость, но я никогда с этим не сталкивался, а где-то по топикам была замечательная фраза - "один корректный пример заменит многостраничный хелп", хотя я понимаю, что это не есть рулезЪ, но все же =)
Заранее спасибо..


 
Илайдж   (2003-10-16 11:25) [6]

может я чего неправильно в принципе делаю
две проги
1 - по нажатию клавиши отсылается сообщение
procedure TForm1.Button1Click(Sender: TObject);
var
MS : THandle;
FullSlot: string;
BytesWritten: DWORD;
data: pchar;
length: cardinal;
begin
data:="hello";
length := StrLen(data);
FullSlot := "\\PCNAME\mailslot\XXX";
MS := CreateFile (PChar (FullSlot), GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if MS=INVALID_HANDLE_VALUE then begin
showmessage("E");
Exit;
end;
Button1.Caption := inttostr(ms);
BytesWritten:=0;
if (not WriteFile (MS, Pointer (Data)^, Length, BytesWritten, nil)) or (BytesWritten <> Length) then Exit
else begin
label1.Caption := "Отправлены данные на " + FullSlot + ": " + Data + ", длина "+ InttoStr(BytesWritten) + "/" + Inttostr(length);
end;

Т.е по нажатию кнопки меняется ее капшн и капшн лейбла.
Типа: на кнопке 928 и на лейбле "Отправлены данные на \\PCNAME\mailslot\XXX Hello 5/5

Вторая программа

FullSlot := "\\MEGAMOZG\mailslot\XXX";
ms := CreateFile (PChar (FullSlot), GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if ms = invalid_handle_value then exit
else timer1.Enabled := true;

Таймер

GetMailslotInfo(ms, nil, NextMsgSize, @MsgCount, nil);
ListBox1.Items.Add(inttostr(ms) + " : " + inttostr(NextMsgSize) + " " + inttostr(MsgCount));


каждую секунду в листбокс выводится
928: 0 0
жму кнопку в первой программе - ничего не меняется..
closeHandle(ms);
end;


 
Илайдж   (2003-10-16 11:26) [7]

В смысле PCNAME в первом случае = "MEGAMOZG"
ну в общем, пойду повешусь =)


 
Rouse_   (2003-10-16 13:16) [8]

> Илайдж ©
Сегодня вечером постараюсь дать из дома примерчик, если будет время.

Желаю успехов


 
Илайдж   (2003-10-16 15:35) [9]

С нетерпением жду-с..
Можно на мыло, в общем куда удобней
Заранее спасибо.


 
Rouse_   (2003-10-16 22:16) [10]

Вот обещанное :))

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
MailSlot: THandle;
ErrStr: array [0..MAX_PATH] of Char;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
CurrentSize, Size, Count: DWORD;
Msg: String;
Err: LongBool;
I: Integer;
From, sTo: String;
begin
Count := 0;
Err := GetMailSlotInfo(MailSlot, nil, Size, @Count, nil);
if not Err then
begin
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
nil,
GetLastError,
0,
@ErrStr[0],
MAX_PATH,
nil);
Memo1.Lines.Add("Can not GetMailSlotInfo: " + String(ErrStr));
Exit;
end;
if Count > 0 then
begin
SetLength(Msg, Size);
ReadFile(MailSlot, Msg[1], Size, CurrentSize, nil);
I := 1;
while (Msg[I] <> #0) do Inc(I);
From := Copy(Msg, 1, I - 1);
Delete(Msg, 1, I);
I := 1;
while (Msg[I] <> #0) do Inc(I);
sTo := Copy(Msg, 1, I - 1);
Delete(Msg, 1, I);
OemToChar(PChar(From), PChar(From));
OemToChar(PChar(sTo), PChar(sTo));
OemToChar(PChar(Msg), PChar(Msg));
Memo1.Lines.Add("Получено сообщение от: " + From +
" для " + sTo + #13#10 + Msg);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MailSlot := CreateMailslot("\\.\mailslot\messngr", 0, MAILSLOT_WAIT_FOREVER, nil);
if MailSlot = INVALID_HANDLE_VALUE then
begin
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
nil,
GetLastError,
0,
@ErrStr[0],
MAX_PATH,
nil);
Memo1.Lines.Add("Can not create mailslot: " + String(ErrStr));
Exit;
end;
end;

end.


Желаю успехов

ЗЫ: почаще пользуйтесь МСДН, там все великолепно расписано.


 
Rouse_   (2003-10-16 22:30) [11]

Да, забыл еще.

CloseHandle(MailSlot);

Это на TForm1.OnClose нужно сделать.

Желаю успехов


 
Илайдж   (2003-10-17 10:24) [12]

ААААААААААААААААААААААААА
Я сделал это! Спасибо огромное всем, кто принимал участие!!


 
wawari   (2003-10-22 16:29) [13]

Если все клиенты работают на W2K
и выше можно не заморачиваться
а включить поддержку отслеживания изменившихся связей.
и просто переименовывать прогу на серваке
кто не вышел еще будет работать со старой
кто вышел зашол уже с новой.
При этом если обновление не терпит работы со старым .ехе
надо просто сбросить все конектя на этот файл


 
DAnton   (2003-11-25 07:37) [14]

Толи я ....., то ли лыжи не едут. Не получилось ничего, пишет что неверный дискриптор.


 
Rouse_   (2003-11-25 09:23) [15]

Где именно на какой строчке?


 
serg2000   (2003-12-09 17:04) [16]

скажите плиз - что такое майлслоты и с чем их едят
или подскажите форум, где можно найти ответ

я энтот термин в сетевом одном чате нашел, типа сообщения там посылаются через эти самые майлслоты, но как их перехватывать, не запуская сам чат? т.е. надо написать прогу работающую и читающую инфу с майлслотов.


 
Rouse_   (2003-12-09 17:17) [17]

> serg2000 (09.12.03 17:04) [16]

A mailslot is a pseudofile; it resides in memory, and standard Windows file functions write to it. Unlike disk files, however, mailslots are temporary. When every handle of a mailslot is closed, the mailslot and all the data it contains are deleted. The data in a mailslot message can be in any form.

A mailslot server is a process that creates and owns a mailslot. When the server creates a mailslot, it receives a mailslot handle. This handle must be used when a process reads messages from the mailslot. Only the process that creates a mailslot (or has obtained the handle by some other mechanism, such as inheritance) can read from the mailslot. A mailslot exists until all server handles to it have been closed or all server processes have exited. All mailslots are local to the process that creates them; a process cannot create a remote mailslot.

A mailslot client is a process that writes a message to a mailslot. Any process that has the name of a mailslot can put a message there. New messages follow preexisting messages in the mailslot.
Mailslots can broadcast messages within a domain. If several processes in a domain each create a mailslot using the same name, every message that is addressed to that mailslot and sent to the domain is received by the participating processes. Because one process can control both a server mailslot handle and the client handle retrieved when the mailslot is opened for a write operation, applications can easily implement a simple message-passing facility within a domain.

Some developers choose to use named pipes instead of mailslots for interprocess communications. Named pipes are a simple way for two processes to exchange messages. Mailslots, on the other hand, are a simple way for a process to broadcast messages to many other processes. For more information about named pipes, see Pipes.
Another issue in the choice between mailslots and named pipes is that mailslots use datagrams, and named pipes do not. A datagram is a small packet of information that the network sends along the wire. Like a radio or television broadcast, a datagram offers no confirmation of receipt; there is no way to guarantee that a datagram has been received. Just as mountains, large buildings, or interfering signals might cause a radio or television signal to get lost, there are things the sender has no knowledge of that can prevent a datagram from reaching a particular destination. Named pipes are more like simple one-to-one telephone calls: you can talk only to one party, but you know that the conversation is occurring. So, if an application requires guaranteed reception, it should use a named pipe; but named pipes cannot broadcast. Mailslots do not guarantee reception, but they can broadcast.


 
Rouse_   (2003-12-10 02:39) [18]

А ответ на второй вопрос ищите здесь,
> [10] Rouse_ © (16.10.03 22:16)
только предварительно нужно отключить WinPopUp в 9х или соответствующую службу в NT...



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
1-29330
dima_matrix
2004-01-27 20:55
2004.02.10
Форма в новом потоке


7-29639
DeMoN_Astra
2003-11-21 01:59
2004.02.10
Мышшшь ;)


7-29630
Виталя
2003-11-24 10:34
2004.02.10
Как програмно изменить раскладку клавиатуры ?


14-29592
-Wind-
2004-01-19 11:15
2004.02.10
Всегда писал на С, а тепрь надо на делфи...


1-29383
Almaz
2004-02-01 05:04
2004.02.10
AutoComplete в TWebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский