Форум — Ответы ( К темам )
? | 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"; } |