Re: MailSlot
От: Aleks M. Украина  
Дата: 12.06.03 05:25
Оценка:
Здравствуйте, 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;
}
}

int iNewItem = ListView_GetItemCount (ghListView);
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvi.iItem = iNewItem;
lvi.iSubItem = 0;
if (AB_USER_ADDED == Notif.Event)
{

lvi.pszText = Notif.Info.MB.szMailboxName;
lvi.lParam = Notif.Info.MB.dwObjID;
lvi.iImage = IMG_USER_MAILBOX;
}
else
{
lvi.pszText = Notif.Info.DL.szDLAlias;
lvi.lParam = Notif.Info.DL.dwObjID;
lvi.iImage = IMG_DIST_LIST;
}
lvi.iItem = ListView_InsertItem (ghListView, &lvi);
if (AB_USER_ADDED == Notif.Event)
{
ListView_SetItemText (ghListView, lvi.iItem, 1, Notif.Info.MB.szFullName);
ListView_SetItemText (ghListView, lvi.iItem, 2, Notif.Info.MB.szJobTitle);
ListView_SetItemText (ghListView, lvi.iItem, 3, Notif.Info.MB.szOffice);
ListView_SetItemText (ghListView, lvi.iItem, 4, Notif.Info.MB.szPhone);
ListView_SetItemText (ghListView, lvi.iItem, 5, Notif.Info.MB.szAltPhone);
ListView_SetItemText (ghListView, lvi.iItem, 6, Notif.Info.MB.szFax);
}
else
{
ListView_SetItemText (ghListView, lvi.iItem, 1, Notif.Info.DL.szDLFullName);
}
}
break;

case AB_USER_DELETED :
case AB_USER_MODIFIED :
case AB_DL_DELETED :
case AB_DL_MODIFIED :
if (AB_USER_DELETED == Notif.Event || AB_USER_MODIFIED == Notif.Event)
{
if (ITEM_SERVER_USER_MAILBOXES != g_LVItemsType)
{
break;
}
}
else
{
if (ITEM_SERVER_DIST_LISTS != g_LVItemsType)
{
break;
}
}
lfi.flags = LVFI_STRING;
if (AB_USER_MODIFIED == Notif.Event || AB_USER_DELETED == Notif.Event)
{
lfi.psz = Notif.Info.MB.szMailboxName;
}
else
{
lfi.psz = Notif.Info.DL.szDLAlias;
}
lvi.iItem = ListView_FindItem (ghListView, -1, &lfi);
if (-1 == lvi.iItem)
{
break;
}
if (AB_DL_DELETED == Notif.Event || AB_USER_DELETED == Notif.Event)
{
ListView_DeleteItem (ghListView, lvi.iItem);
}
else
{
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
lvi.iSubItem = 0;
if (AB_USER_MODIFIED == Notif.Event)
{
lvi.pszText = Notif.Info.MB.szMailboxName;
lvi.lParam = Notif.Info.MB.dwObjID;
lvi.iImage = IMG_USER_MAILBOX;
ListView_SetItem (ghListView, &lvi);
ListView_SetItemText (ghListView, lvi.iItem, 1, Notif.Info.MB.szFullName);
ListView_SetItemText (ghListView, lvi.iItem, 2, Notif.Info.MB.szJobTitle);
ListView_SetItemText (ghListView, lvi.iItem, 3, Notif.Info.MB.szOffice);
ListView_SetItemText (ghListView, lvi.iItem, 4, Notif.Info.MB.szPhone);
ListView_SetItemText (ghListView, lvi.iItem, 5, Notif.Info.MB.szAltPhone);
ListView_SetItemText (ghListView, lvi.iItem, 6, Notif.Info.MB.szFax);
}
else
{
lvi.pszText = Notif.Info.DL.szDLAlias;
lvi.lParam = Notif.Info.DL.dwObjID;
lvi.iImage = IMG_DIST_LIST;
ListView_SetItem (ghListView, &lvi);
ListView_SetItemText (ghListView, lvi.iItem, 1, Notif.Info.DL.szDLFullName);
}
}
break;
case RESET_LINKS_WITH_SERVER :
PostMessage (ghWnd, WM_WINDS_RESET_NOTIF_LINK, 0, 0);
break;
}
}
return S_OK;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.