Здравствуйте, MegaDen, Вы писали:
MD>Всем привет. MD>ДО установки сетевого подлючения , которое может принимать MD>входящие подлючения вопросов не было. MD>ПОСЛЕ добавления оного сетевого подлючения обнаружил след.странность : MD>Если при при подлючении к "удаленному" слоту ,который MD>создан на локальной машине , в первом параметре CreateFile MD>указать ПОЛНОЕ имя компьютера , напр. MD>CreateFile(PChar('\\FULLNAMEOFCOMPUTER\mailslot\testslot'), MD> GENERIC_WRITE, MD> FILE_SHARE_READ, MD> nil, MD> OPEN_EXISTING, MD> FILE_ATTRIBUTE_NORMAL, MD> 0);то при записи в слот одного "сообщения" в него MD>попадает сразу его две копии.То есть при GetMailSlotInfo я узнаю MD>что у меня в слоте хрянятся ДВА одинаковых а не одно единственное MD>сообщение.Если же в имени слота НЕ использоать полное имя компьютера , а напр. написать PChar('\\.\mailslot\testslot') то опять таки все работает идеально.Повторюсь такое загадочное поведения началось только после установки нового сетевого подкл.(см.выше).Может кто подскажет из за чего так происходит ?
Мейлслотовские сообщения доставляются по всем протоколам, установленным на компьютере, т.е. если имеешь TCP и IPX, то будешь получать на одну посылку — 2 приёма.
Попробуй передавать с сообщением временную метку.
Ещё вот:
Пример из MSDN MAPI:
///////////////////////////////////////////////////////////////////////////////
// MailslotListenThreadProc()
//
// Parameters
//
// Purpose
// This is function runs in a separate low priority thread listening for
// notification that a WINDS server sends.. When a
// notification of interest is received, an appropiate action is taken.
// The notification arrive on a mailslot created by the logon object.
//
// Return Value
// S_OK always.
//
DWORD WINAPI MailslotListenThreadProc (CNotifLink * pLink)
{
TCHAR szBuffer[256] = { 0 };
LV_FINDINFO lfi = { 0 };
LV_ITEM lvi = { 0 };
HANDLE hMailslot = pLink->GetListenMailslot();
DWORD dwRead;
FILETIME ftLastNotifTime = { 0 };
WINDS_NOTIF_EVENT LastEvent;
WINDS_NOTIFICATION Notif;
HRESULT hReadError;
while (TRUE)
{
if (!ReadFile (hMailslot, &Notif, sizeof(WINDS_NOTIFICATION), &dwRead, NULL))
{
hReadError = HRESULT_FROM_WIN32 (GetLastError());
if (HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE) == hReadError ||
HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) == hReadError)
{
break; // out of the WHILE() loop and terminate the thread
}
TraceResult ("MailslotListenThreadProc: ReadFile", HRESULT_FROM_WIN32(GetLastError()));
continue;
}
// Mailslot are received in each network protocol stack installed on the system.
// Check the time stamp and event of the last notification received. If it
// is the same, drop it and continue listen for new and different incoming
// data on the mailslot.
if (ftLastNotifTime.dwLowDateTime == Notif.ftEventTime.dwLowDateTime &&
ftLastNotifTime.dwHighDateTime == Notif.ftEventTime.dwHighDateTime &&
LastEvent == Notif.Event)
{
continue;
}
// Save the last event information
ftLastNotifTime = Notif.ftEventTime;
LastEvent = Notif.Event;
#ifdef DO_INFO_TRACES
switch (Notif.Event)
{
case AB_USER_ADDED :
InfoTrace ("AB_USER_ADDED notification received from the WINDS server");
break;
case AB_USER_MODIFIED :
InfoTrace ("AB_USER_MODIFIED notification received from the WINDS server");
break;
case AB_USER_DELETED :
InfoTrace ("AB_USER_DELETED notification received from the WINDS server");
break;
case AB_DL_ADDED :
InfoTrace ("AB_DL_ADDED notification received from the WINDS server");
break;
case AB_DL_MODIFIED :
InfoTrace ("AB_DL_MODIFIED notification received from the WINDS server");
break;
case AB_DL_DELETED :
InfoTrace ("AB_DL_DELETED notification received from the WINDS server");
break;
case MS_MESSAGE_ADDED :
case MS_MESSAGE_MODIFIED :
case MS_MESSAGE_DELETED :
case MS_FOLDER_ADDED :
case MS_FOLDER_MODIFIED :
case MS_FOLDER_DELETED :
break;
case SERVER_IS_SHUTTING_DOWN :
InfoTrace ("SERVER_IS_SHUTTING_DOWN notification received from the WINDS server");
break;
case RESET_LINKS_WITH_SERVER :
InfoTrace ("RESET_LINKS_WITH_SERVER notification received from the WINDS server");
break;
case SERVER_HAS_RESTARTED :
InfoTrace ("SERVER_HAS_RESTARTED notification received from the WINDS server");
break;
case AB_GET_LOCAL_ABDATA_NOW :
InfoTrace ("AB_GET_LOCAL_ABDATA_NOW notification received from the WINDS server");
break;
default :
InfoTrace ("UNKNOWN notification received from the WINDS server");
break;
}
#endif // DO_INFO_TRACES
switch (Notif.Event)
{
case AB_USER_ADDED :
case AB_DL_ADDED :
{
if (AB_USER_ADDED == Notif.Event)
{
if (ITEM_SERVER_USER_MAILBOXES != g_LVItemsType)
{
break;
}
}
else
{
if (ITEM_SERVER_DIST_LISTS != g_LVItemsType)
{
break;
}
}