Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблеммы с Mail Slot


kull ©   (2002-03-18 13:35:00) 

Народ! Помогите!

использую mail slot для передачи данных между процессами.

На машине где установлена сеть все работает.
А на локальном PC не работает GetMailSlotInfo. Всегда возврашает что в mail slot ничего нет.
Что за баг и как сэтим бороться?

(Win98 SE)

Заранее спасибо...


VuDZ   (2002-03-18 15:32:00) [1]

тут кое-что лишнее, забыл убить...


VuDZ   (2002-03-18 15:26:00) [2]

на тебе другй вариант - всё работает отлично:

#include
HANDLE hSlot1 = NULL;

void _reader(LPVOID){
BYTE * pbBuf = new BYTE[256];
ZeroMemory(pbBuf, 255);
DWORD bSize =255;
OVERLAPPED ov;
OFSTRUCT of;

WaitForSingleObject(hSlot1, INFINITE);
LPSTR lpszBuffer = (LPSTR) GlobalAlloc(GPTR,
16 + bSize);

lpszBuffer[0] = "\0";

BOOL fResult = ReadFile(hSlot1,
lpszBuffer,
bSize,
&bSize,
NULL);

if (!fResult)
{
printf("Error - ReadFile\n");
GlobalFree((HGLOBAL) lpszBuffer);
return;
}

// Display the message.

MessageBox(0,
lpszBuffer,
"Contents of Mailslot",
MB_OK);

GlobalFree((HGLOBAL) lpszBuffer);


if (fResult)
printf((const char*)pbBuf);
else
printf("Fault due reading - %i\n", GetLastError());
}

void _writer(LPVOID){
Sleep(1000);
LPSTR lpszMessage = "Some stupid message";
BOOL fResult;
HANDLE hFile;
DWORD cbWritten;

hFile = CreateFile("\\\\*\\mailslot\\sample_mailslot",
GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
printf("Fault for opening\n");
return;
}

fResult = WriteFile(hFile,
lpszMessage,
(DWORD) lstrlen(lpszMessage) + 1, // include terminating null
&cbWritten,
(LPOVERLAPPED) NULL);

if (!fResult){
printf("Unable to write :


kull   (2002-03-18 15:04:00) [3]

Не ставить "Клиента сетей Microsoft" - это, конечно вариант, но не дело.

Юзер может не хочет, что при инсталяции пакета ему еще всякое г. ставилось, да и не красиво это.

Може есть другой вариант?


VuDZ   (2002-03-18 14:57:00) [4]

попроб ую


VuDZ   (2002-03-18 14:56:00) [5]

ну и поставь "Клиента сетей Microsoft" - я видел у разного софта что надо, мол, такие-то компоненты инсталить для успешной работы, почему-бы и не пойти по такомцу пути - это ведь не твои проблемы.

Слушай, а WaitForSingleObject нельщя попробовать на это дело натравить - дать ей хэндл маилслота и пусть ждёт... минут через 10-15 попробуй такое сделать


kull   (2002-03-18 14:50:00) [6]

Дело в том что на локальном компьютере GetMailSlotInfo возвращает 0 записей.

А если на нем поставить Клиента сетей Microsoft, то слот работает и передается информация.

в том же MSDN предлагается сделать цикл, но это загрузит проц.

Я попробовал Просто читать без GetMailSlotInfo с помощью ReadFile - записи в mail slot-е есть и нормально читаются.

Но тут начинается еще более веселая фишка:
Через 30 минут кручения такого цикла память так засоряется, что far не открывается, и другие программы тормозят.

Причем если попробовать разные интервалы в Sleep то еще интересней - при отсуствии Sleep память не растет, а если
Sleep(1) то растет.

Ну вооще фокусы!...........


VuDZ   (2002-03-18 14:30:00) [7]

нашёл (вот засланцы. на сайте нет, а на дисках есть - что-то я их не понимаю :< )
SYMPTOMS
If you call the GetMailSlotInfo function in Microsoft Windows 95 OEM Service Release 2 (OSR2) or Windows 98 without a network client installed, you may receive an incorrect value (a large positive or a negative number) for the lpNextSize parameter. If you repeatedly call the function, it usually returns the correct value.

RESOLUTION
A supported fix is now available from Microsoft, but it is only intended to correct the problem described in this article and should be applied only to systems experiencing this specific problem.

в чём проблема-то? а то я после гонки по кутузовке ещё плохо сообажаю :E


VuDZ   (2002-03-18 14:27:00) [8]

что-то msdn/library не знает такого бага.
Скорее всего, маил слоты зависят от железа, при их создание нужна привязка к железу пр. и ничего без этого не выйдет.

Если нужно межпроцессовое взаимодействие используй WM_USER + SharedMemory, смотри, в общем, Interprocess Communication


kull   (2002-03-18 13:43:00) [9]

Да видел я эти демки...
Я все так и пробовал делать, но в том-то и дело,
что на машине с сетью все работает,
а вот на локальной таже демка не пашет.

Посмотри в MSDN баг под номером Q192276.


VuDZ   (2002-03-18 13:39:00) [10]

попробуй это /ломает меня свои демки писать, буду MSDN"овскими кормить :> /

BOOL WINAPI Readslot(HWND hwnd, HDC hdc)
{
DWORD cbMessage, cMessage, cbRead;
BOOL fResult;
LPSTR lpszBuffer;
CHAR achID[80];
DWORD cAllMessages;
HANDLE hEvent;
OVERLAPPED ov;

cbMessage = cMessage = cbRead = 0;

hEvent = CreateEvent(NULL, FALSE, FALSE, "ExampleSlot");
ov.Offset = 0;
ov.OffsetHigh = 0;
ov.hEvent = hEvent;

// Mailslot handle "hSlot1" is declared globally.

fResult = GetMailslotInfo(hSlot1, // mailslot handle
(LPDWORD) NULL, // no maximum message size
&cbMessage, // size of next message
&cMessage, // number of messages
(LPDWORD) NULL); // no read time-out

if (!fResult)
{
ErrorHandler(hwnd, "GetMailslotInfo");
return FALSE;
}

if (cbMessage == MAILSLOT_NO_MESSAGE)
{
TextOut(hdc, 10, 10, "No waiting messages.", 20);
return TRUE;
}

cAllMessages = cMessage;

while (cMessage != 0) // retrieve all messages
{
// Create a message-number string.

wsprintf((LPSTR) achID,
"\nMessage #%d of %d\n", cAllMessages - cMessage + 1,
cAllMessages);

// Allocate memory for the message.

lpszBuffer = (LPSTR) GlobalAlloc(GPTR,
lstrlen((LPSTR) achID) + cbMessage);

lpszBuffer[0] = "\0";

fResult = ReadFile(hSlot1,
lpszBuffer,
cbMessage,
&cbRead,
&ov);

if (!fResult)
{
ErrorHandler(hwnd, "ReadFile");
GlobalFree((HGLOBAL) lpszBuffer);
return FALSE;
}

// Concatenate the message and the message-number string.

lstrcat(lpszBuffer, (LPSTR) achID);

// Display the message.

MessageBox(hwnd,
lpszBuffer,
"Contents of Mailslot",
MB_OK);

GlobalFree((HGLOBAL) lpszBuffer);

fResult = GetMailslotInfo(hSlot1, // mailslot handle
(LPDWORD) NULL, // no maximum message size
&cbMessage, // size of next message
&cMessage, // number of messages
(LPDWORD) NULL); // no read time-out

if (!fResult)
{
ErrorHandler(hwnd, "GetMailslotInfo");
return FALSE;
}
}
return TRUE;
}


Наверх

Титульная страница Поиск, карта сайта Написать письмо