Форум — Ответы     (  К темам )
 ?  Dr.Phoenix: Как послать по сети мксагу типа net send, чтоб и в win9х в работало (09-12-2002 16:40:23)
Q> Как послать сообщение юзеру(а-ля net send)
A>

Вариант 1:

NET_API_STATUS x=NetMessageBufferSend(
LPTSTR servername,
LPTSTR msgname,
LPTSTR fromname,
LPBYTE buf,
DWORD buflen
);

Вариант 2:

From: "Alexandr Shandra" <entryway@astral.ntu-kpi.kiev.ua>

Можно через CreateFile/WriteFile, но в этом случае можно послать сообщение
только компьютеру либо на локальную рабочую группу.

Вот пример:(работает как под NT так и под 9x);

HANDLE hSlot = CreateFile("\\\\computername\\mailslot\\messngr",
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hSlot != INVALID_HANDLE_VALUE)
{
char buf = "From\0\To\0Message\0";
uint cb = sizeof(buf);
WriteFile(hSlot, buf, cb, &cb, NULL);
CloseHandle(hSlot);
}
------------------------------
так вот. я пробовал оба способа и ничего не получилось. первый даже не компилировался: билдер находил ошибки в lmmsg.h, а второй не получилось заставить работать.

Подскажите в чем причина, плз! А еще лучше покажите пример простеньких програмок (желательно проверенных на работоспособность) с коментариями!
Очень не хочется помереть ламером :)
 Devnvd (11-12-2002 13:42:46)
Послать сообщение вы сможете так. Это работает.
Обратите внимание, что текст необходимо перекодировать в OEM,
так как стандартные WinPopup сделают при приёме автоматом
перекодировку OEM->ANSI, незадумываясь о том в какой
кодировке к ним пришло сообщение.

bool SendNetMessage(AnsiString Komp, AnsiString Mes)
{
AnsiString From;
char CompName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size=MAX_COMPUTERNAME_LENGTH + 1;
//Откуда
if(!GetComputerName(CompName,&size))return false;
From=CompName;

if(Mes.Length()==0)return false;

HANDLE hSlot = CreateFile(("\\\\"+Komp+"\\mailslot\\messngr").c_str(),
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hSlot == INVALID_HANDLE_VALUE)return false;
DWORD cb=0;
BOOL ret;
char *buf=new char[From.Length()+1+Komp.Length()+1+Mes.Length()+1];
//1. From
memcpy(&buf[cb],From.c_str(),From.Length()+1);
cb +=From.Length()+1; //+1 на конце должен быть 0
//2. To
memcpy(&buf[cb],Komp.c_str(),Komp.Length()+1);
cb +=Komp.Length()+1;
//3. Само сообщение
memcpy(&buf[cb],Mes.c_str(),Mes.Length()+1);
cb +=Mes.Length()+1;
//ConvertToDos
CharToOemBuff(buf,buf,cb);

ret=WriteFile(hSlot, buf,cb, &cb, NULL);
CloseHandle(hSlot);
delete[] buf;
if(!ret) return false;
return true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Komp,Mes;
//Кому
Komp=Edit1->Text;//Name PC
//Сообщение
Mes=Edit3->Text; //Message

StatusBar1->Panels->Items[0]->Text="";
bool ret=SendNetMessage(Komp,Mes);
if(ret)
StatusBar1->Panels->Items[0]->Text="Message send succesfully";
else
StatusBar1->Panels->Items[0]->Text="Message no send";
}