WinApi при попытке записать в mailslot получаю отказано в доступе
Имею 2 процесса, один считывает данные пользователя другой считывает их. Первый процесс должен записать в mailslot данные, другой считать. При попытке записать получаю ошибку 5 отказано в доступе, а при чтении 87 параметр задан неверно. С плюсами знаком плохо, сам пишу на другом языке. Это нужно чисто для универа. Как это исправить?
Первый процесс
int main()
{
HANDLE m = CreateMutex(NULL, FALSE, L"MyMutex");
if (m == 0)
return -1;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (CreateProcess(L"c:\\Users\\user\\Desktop\\Lab3\\Procces1\\Debug\\Procces1.exe", NULL,
NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi) == TRUE) {
bool flagEnd = true;
double a,b,c;
HANDLE mail = CreateMailslot(L"\\\\.\\mailslot\\c:\\Users\\user\\Desktop\\Lab3\\mail", 0, MAILSLOT_WAIT_FOREVER, NULL);
if (mail == 0)
return -1;
while (true) {
WaitForSingleObject(m, INFINITE);
cout << "Please enter A and B values\n";
cout << "A = ";
cin >> a;
cout << "B = ";
cin >> b;
WriteFile(mail, &a, sizeof(double), NULL, NULL);
WriteFile(mail, &b, sizeof(double), NULL, NULL);
cout << GetLastError();
ReleaseMutex(m);
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(m);
}
else {
cout << "Process has not been created\n";
}
return 0;
}
Второй процесс
int main()
{
HANDLE mut = OpenMutex(MUTEX_ALL_ACCESS, TRUE, L"MyMutex");
if (mut == 0)
return -1;
HANDLE mail = CreateFile(L"\\\\.\\mailslot\\c:\\Users\\user\\Desktop\\Lab3\\mail", GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (mail == 0)
return -1;
double a, b, c;
DWORD byte;
while (true) {
WaitForSingleObject(mut, INFINITE);
cout << "Reading\n";
ReadFile(mail, &a, sizeof(double), NULL, NULL);
ReadFile(mail, &b, sizeof(double), NULL, NULL);
cout << GetLastError();
cout << "I have read " << a << " " << b << endl;
ReleaseMutex(mut);
}
return 0;
}
Ответы (1 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
могу ошибаться, но после CreteFile/CreateMailslot в проверке хэндла надо ставить не 0, а INVALID_HANDLE_VALUE (а он не ноль. #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)). Есть и другие ошибки. Накидал Рабочий пример чтение/запись. Надеюсь поможет
HANDLE mail = CreateMailslot(L"\\\\.\\mailslot\\mylab", 0, MAILSLOT_WAIT_FOREVER, NULL);
if(mail==INVALID_HANDLE_VALUE)
return 0;
HANDLE wh = CreateFile(L"\\\\.\\mailslot\\mylab", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(wh==INVALID_HANDLE_VALUE)
return 0;
static LPTSTR MyMessage = L"1234567890";
BOOL err;
DWORD numWritten;
err = WriteFile(wh, MyMessage, 10, &numWritten, 0);
DWORD cbMessages;
DWORD cbMsgNumber;
err = GetMailslotInfo(mail, NULL, &cbMessages,&cbMsgNumber, NULL);
if(!err){
fprintf(stdout,"GetMailslotInfo: Error %ld\n",
GetLastError());
}
char* buf = (char*)LocalAlloc(LPTR,cbMessages*cbMsgNumber+1);
ReadFile(mail,(LPVOID)buf,cbMessages*cbMsgNumber,&numWritten, 0);
LocalFree((LPVOID)buf);