Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.032 c
7-1076171882
nester
2004-02-07 19:38
2004.04.18
Как добавить задание в Планировщик(он же Scheduler)


1-1080356184
новичок_из_сыктывкара
2004-03-27 05:56
2004.04.18
ascii код backspace


3-1079592838
WondeRu
2004-03-18 09:53
2004.04.18
Какую СУБД выбрать?


4-1076313872
Rentgen
2004-02-09 11:04
2004.04.18
ListView_GetImageList


1-1080590448
Shopot
2004-03-30 00:00
2004.04.18
Динамическое создание и удаление компонентов.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский