Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];

Вниз

Проблеммы с Mail Slot   Найти похожие ветки 

 
kull   (2002-03-18 13:35) [0]

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

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

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

(Win98 SE)

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


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

попробуй это /ломает меня свои демки писать, буду 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;
}


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

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

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


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

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

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


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

нашёл (вот засланцы. на сайте нет, а на дисках есть - что-то я их не понимаю :< )
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


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

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

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

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

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

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

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

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


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

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

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


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

попроб ую


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

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

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

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


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

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

#include <process.h>
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 :<\n");
}

if (!CloseHandle(hFile))
printf("Can"t close a handle\n");

printf("Done\n");
}

int main(){
LPSTR lpszSlotName = "\\\\.\\mailslot\\sample_mailslot";

hSlot1 = CreateMailslot(lpszSlotName, 0, MAILSLOT_WAIT_FOREVER, NULL);

if (hSlot1 == INVALID_HANDLE_VALUE)
return -1;

_beginthread(_writer, 0, NULL);

WaitForSingleObject(_beginthread(_reader, 0, NULL), INFINITE);

return getch();
}


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
4-64881
greenrul
2002-03-11 20:58
2002.05.20
Мастера! Помогите вывести текст из буфера обмена в АКТИВНОЕ приложение.


3-64534
user_Jack
2002-04-23 17:42
2002.05.20
Как избежать абракадабры.


14-64835
f0rm
2002-04-12 12:50
2002.05.20
Красивые икоки для интерфейса


3-64504
Termik
2002-04-23 09:51
2002.05.20
Подскажите, как заставить Oracle выполнить мат. выражение ?


14-64841
Феликс
2002-04-12 17:03
2002.05.20
Почем нынче курсовые, доклады, рефераты?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский