Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2007, 17:38   #1
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию Send Message

Юзаю исходники программы для передачи сообщений по локальной сети. Все работает прекрасно, но.... хотелось бы сохранять историю сообщений, ну, ... как в QIP-е, Аське и т.п.
Свои сообщения я могу добавлять куда угодно, а чужие (которые пришли мне), увы...
Вопрос: как "вытянуть" текст пришедшего мне сообщения в переменную?
(разумеется, программа будет висеть в памяти и "мониторить" все пришедшие сообщения).
_SERGEYX_ вне форума Ответить с цитированием
Старый 12.10.2007, 23:39   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Юзаю исходники программы для передачи сообщений по локальной сети
Вот и ищем в исходниках, где и куда происходит прием и оттуда "вытягиваем"...
mihali4 вне форума Ответить с цитированием
Старый 15.10.2007, 09:40   #3
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Если используется функция NetMessageBufferSend (стандартный механизм форточек), то практически никак. На удаленной машине сообщение принимается и отображатся Windows Messenger (служба msgmsg). Придется как-то отлавливать ее активность. Проще написать свое.
Баламут вне форума Ответить с цитированием
Старый 15.10.2007, 10:07   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Автор, какими компонентами или средствами пользуешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.10.2007, 14:47   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

NetMessageBufferSend. В общем, используется служба отправки сообщений из WinXP.
uses WinSock, ActiveX,ComCtrls;

Ну, и поехали далее...
Код:
function GetIPAddress(name: string): string;
var
   WSAData: TWSAData;
   p: PHostEnt;
begin
   WSAStartup(WINSOCK_VERSION, WSAData);
   p := GetHostByName(PChar(name));
   Result := inet_ntoa(PInAddr(p.h_addr_list^)^);
   WSACleanup;
end;

function CheckDomain(Domain: string): Boolean;
var
   Error: DWORD;
   HostEntry: PHostEnt;
   Data: WSAData;
begin
   Result := False;
   Error := WSAStartup(MakeWord(1, 1), Data);
   if Error = 0 then
   begin
      HostEntry := gethostbyname(PChar(Domain));
      Result := GetLastError = 0;
   end;
   WSACleanup();
end;

function LocalIP: string;
type
   TaPInAddr = array[0..10] of PInAddr;
   PaPInAddr = ^TaPInAddr;
var
   phe: PHostEnt;
   pptr: PaPInAddr;
   Buffer: array[0..63] of Char;
   I: Integer;
   GInitData: TWSAData;
begin
   WSAStartup($101, GInitData);
   Result := '';
   GetHostName(Buffer, SizeOf(Buffer));
   phe := GetHostByName(buffer);
   if phe = nil then Exit;
   pPtr := PaPInAddr(phe^.h_addr_list);
   I := 0;
   while pPtr^[I] <> nil do
   begin
      Result := inet_ntoa(pptr^[I]^);
      Inc(I);
   end;
   WSACleanup;
end;

function IPAddrToName(IPAddr: string): string;
var
   SockAddrIn: TSockAddrIn;
   HostEnt: PHostEnt;
   WSAData: TWSAData;
begin
   WSAStartup($101, WSAData);
   SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
   HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
   if HostEnt <> nil then
      Result := StrPas(Hostent^.h_name)
   else
      Result := '';
end;

function NetSend(const sTo, sMessage: string): Boolean;
type
   PNetMessageBufferSend = ^TNetMessageBufferSend;
   TNetMessageBufferSend = function(
      servername: PWideChar;
      msgname: PWideChar;
      fromname: PWideChar;
      buf: PBYTE;
      buflen: DWORD
      ): Integer; stdcall;
var
   wMessage, wTo: PWideChar;
   i, hLib: Integer;
   NetMessageBufferSend: TNetMessageBufferSend;
begin
   Result := False;
   hLib := LoadLibrary('NetApi32.dll');
   if hlib > 0 then
   try
      @NetMessageBufferSend := GetProcAddress(hLib, 'NetMessageBufferSend');
      if @NetMessageBufferSend <> nil then
      begin
         wMessage := CoTaskMemAlloc((Length(sMessage) + 1) * sizeof(WideChar));
         try
            wTo := CoTaskMemAlloc((Length(sTo) + 1) * sizeof(WideChar));
            try
               StringToWideChar(sMessage, wMessage, Length(sMessage) + 1);
               StringToWideChar(sTo, wTo, Length(sTo) + 1);
               i := NetMessageBufferSend(nil, wTo, nil, PBYTE(wMessage),
                  (Length(sMessage) + 1) * sizeof(WideChar));
               Result := i = ERROR_SUCCESS;
               if not Result then
                  MessageBox(GetForegroundWindow, 'Сообщение не отправлено.', nil, $1010) else
                  MessageDlg('Сообщение отправлено успешно', mtInformation, [mbOk], 0);
            finally
               CoTaskMemFree(wTo);
            end;
         finally
            CoTaskMemFree(wMessage);
         end;
      end
      else
         MessageBox(GetForegroundWindow,
            'Функция NetMessageBufferSend не обнаружена.', nil, $1010);
   finally
      FreeLibrary(hLib);
   end
   else
      MessageBox(GetForegroundWindow, 'NetApi32.dll не загружена.', nil, $1010);
end;
_SERGEYX_ вне форума Ответить с цитированием
Старый 30.10.2007, 06:38   #6
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

если у вас добавляется весь треп в memo или richedit то ты просто на выходе сохраняй это в файл... а если хочешь что бы история постепенно добавлялась то тогда просто создай переменную tstrings и перед выходом из программы загрузи в нее старую историю затем добавь имеющийся треп из memo или richedit в зависимости от того чем ты пользуешься а потом сохраняй в файл значение переменной tstrings... я по крайней мере так делаю.... (:=
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
raised exception class EIdSocketError with message' Socket Error # 10022 Invalid argument eldar Работа с сетью в Delphi 16 08.08.2008 23:49
WinSock (send, recv) AidarBik Работа с сетью в Delphi 1 27.07.2008 15:22
Message-ы Altera Общие вопросы Delphi 9 15.02.2008 09:08
Ошибка: "EAccessViolation with message..." Ravnica Помощь студентам 4 04.11.2007 20:46
типа send или small chat Elm0 Общие вопросы Delphi 1 27.07.2007 18:46