Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизКак передать сообщение по сети? Найти похожие ветки
← →
TankMan © (2004-02-09 20:25) [0]Я тут слышал от своего друга, что программка одна может отправлять по сети простые текстовые сообщения на другой компьютер, причем никаких клиентов не нужно на удаленном компьютере(?!?!) - но факт есть факт... так что вопрос...может кто знает, как это можно реализовать? и самое интересное, что это работает еще и на 98...
← →
Rouse_ © (2004-02-09 20:57) [1]Так называемые мэйлслоты...
Про клиенты - это конечно перебор, как минимум кто-то должен слушать мэйлслот, будь то служба сообщений, WinPopUp либо другая программа, работающая по данному принципу...
Вот два примера отправки:
Для 98:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
SpinEdit1: TSpinEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
MSHandle: THandle;
MSMessage: array [0..2] of String;
ResultMsMessage: String;
MSWrite: DWORD;
ServerName: String;
begin
ServerName := Edit1.Text;
if ServerName = "" then ServerName := "*\";
if ServerName[Length(ServerName)] <> "\" then ServerName := ServerName + "\";
MSHandle := CreateFile(PChar("\\" + ServerName + "mailslot\messngr"),
GENERIC_WRITE, // or GENERIC_READ,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if not Win32Check(MSHandle <> INVALID_HANDLE_VALUE) then Exit;
MSMessage[0] := Edit2.Text;
MSMessage[1] := Edit3.Text;
MSMessage[2] := Memo1.Text;
CharToOem(PChar(MSMessage[0]), PChar(MSMessage[0]));
CharToOem(PChar(MSMessage[1]), PChar(MSMessage[1]));
CharToOem(PChar(MSMessage[2]), PChar(MSMessage[2]));
ResultMsMessage := MSMessage[0] + #0 + MSMessage[1] + #0 + MSMessage[2];
// Максимум отправляется 424 символа
// В нетсенде данного ограничения нет
ResultMsMessage := ResultMsMessage + StringOfChar(" ", SpinEdit1.Value - Length(ResultMsMessage));
WriteFile(MSHandle, Pointer(PChar(ResultMsMessage))^, Length(ResultMsMessage), MSWrite, nil);
Win32Check(MSWrite = Length(ResultMsMessage));
CloseHandle(MSHandle);
end;
end.
и для NT:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
NetApi32 = "NetApi32.dll";
function NetMessageBufferSend(
servername:PWideChar ;
msgname:PWideChar ;
fromname:PWideChar ;
buf:PWideChar ;
buflen:DWORD):DWORD;stdcall;
var
Form1: TForm1;
implementation
function NetMessageBufferSend; external NetApi32 name "NetMessageBufferSend";
{$R *.dfm}
Function SendLanMessage(FromName,ToName:String;Text:String):Boolean;
Var
RName,TName,HostName: LPCWSTR;
buf: Pointer;
size: Integer;
Begin
Result:=True;
HostName:=nil;
size := SizeOf (WideChar) * Length (FromName)+1;
GetMem (RName, Size);
RName :=StringToWideChar (FromName, RName, Length (FromName)+1);
size := SizeOf (WideChar) * Length (ToName)+1;
GetMem (TName, Size);
TName :=StringToWideChar (ToName, TName, Length (ToName) + 1);
// Перевод String в WideString
size := SizeOf (WideChar) * Length (text)+1;
GetMem (buf, Size);
TRY
PWideChar (Buf) := StringToWideChar (text, buf, Length (text) + 1);
If NetMessageBufferSend (HostName, rname, tname, buf, size) <> NO_ERROR
then Result:=False;
FINALLY
FreeMem(buf);
IF assigned(TNAME) then FreeMem(TName);
IF assigned(RNAME) then FreeMem(RName);
IF assigned(HOSTNAME) then FreeMem(HOSTNAME);
END;
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
SendLanMessage(<кому>, <от кого>, <сообщение>);
end;
end.
Так же в NT можно выполнить командуnet send <Имя компьютера> <Сообщение>
Делаю успехов
← →
Rouse_ © (2004-02-09 20:58) [2]ЗЫ: В смысле Желаю успехов ;)
← →
DVM © (2004-02-09 21:21) [3]
> причем никаких клиентов не нужно на удаленном компьютере(?!?!)
> - но факт есть факт...
в 2000/XP есть служба Network Messenger (Служба сообщений, не путать с Messenger). Она и принимает. Так что клиент все же есть.
В 98 этого нет. Там WinPopup должна быть запущена например.
← →
DeadMeat © (2004-02-10 15:24) [4]Удалено модератором
← →
TankMan © (2004-02-10 18:08) [5]WinPopUP говоришь?...странно, нужно будет самому лично посмотреть на эту программку..(ту что "без всяких клиентов запускает".), может действительно у того пацана была winpopup запущена..
А вообще спасибо за пример...(еще не пробовал его правда :) )...но всеравно спасибо :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.028 c