Автор: Delirium WEB-сайт: http://delphibase.endimus.com { **** UBPFD *********** by delphibase.endimus.com **** >> Обратная связь от MSSQL-сервера к клиенту
На форуме постоянно возникает вопрос - "Как получить обновление данных, по событию, а не таймером", чтобы снять его раз и навсегда привожу код dll-ки, которая является Extended Stored Procedure с единственной функцией - отправкой UDP-broadcast сообщения.
Зависимости: Windows, SysUtils, IdUDPClient Автор: Delirium, VideoDVD@hotmail.com, ICQ:118395746, Москва Copyright: Delirium (Master BRAIN) 2003 Дата: 24 октября 2003 г. ***************************************************** }
library Messager;
uses Windows, SysUtils, IdUDPClient;
function srv_rpcparams(srvproc: Pointer): integer; cdecl; external 'opends60.dll' name 'srv_rpcparams';
function srv_paramdata(srvproc: Pointer; n: integer): integer; cdecl; external 'opends60.dll' name 'srv_paramdata';
function srv_paramlen(srvproc: Pointer; n: integer): integer; cdecl; external 'opends60.dll' name 'srv_paramlen';
procedure SendUDPMessage(Params: Pointer); stdcall; cdecl; export; var id: TIdUDPClient; Msg: string; Host, Port: string; begin try if srv_rpcparams(Params) < 2 then exit; Host := Copy(PChar(srv_paramdata(Params, 1)), 1, srv_paramlen(Params, 1)); Port := Copy(Host, Pos(':', Host) + 1, Length(Host)); Delete(Host, Pos(':', Host), Length(Host)); Msg := Copy(PChar(srv_paramdata(Params, 2)), 1, srv_paramlen(Params, 2)); id := TIdUDPClient.Create(nil); id.BroadcastEnabled := True; id.Host := Host; id.Port := StrToInt(Port); id.ReceiveTimeout := -1; id.Send(Msg); id.Free; except end; end;
exports SendUDPMessage;
begin end.
Пример использования:
Для регистрации на MSSQL скопировать dll в c:\Program Files\Microsoft SQL
Server\80\Tools\Binn и исполнить скрипт sp_addextendedproc 'SendUDPMessage',
'Messager.dll' На клиенте рекомендую использовать компонент TIdUDPServer.
Передача сообщений осуществляется так exec SendUDPMessage
'255.255.255.255:8080', 'Привет!' где 255.255.255.255 - broadcast маска, но
можно написать и конкретный адрес (192.168.1.10), 8080 - выбранный для
использования порт. |