GetMailslotInfo завершается с ошибкой - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Продолжаю осваивать работу с почтовыми ящиками в Windows. Не знаю, может быть стоило выбрать именованный канал для передачи сообщений между процессами, но хотелось бы довести тему с ящиками до конца. Короче говоря, создаю я ящик API функцией CreateMailslot, и пытаюсь получить информацию о нем с помощью GetMailslotInfo. В результате Marshal.GetLastWin32Error возвращает ошибку 6. Код CreateMailslot и GetMailslotInfo, соответственно. Кто может, объясните, пожалуйста, что делаю не так.
using System;
using System.Runtime.InteropServices;
 
namespace createms
{
    class Program
    {
        //Создание почтового ящика процессом-сервером.
        [DllImport("kernel32.dll",SetLastError=true)]
        static extern IntPtr CreateMailslot(
            string lpName,         //имя почтового ящика.
            uint nMaxMessageSize,  //максимальная длина сообщения.
            uint lReadTimeout,     //интервал ожидания.
            IntPtr lpSecurityAttributes);  //атрибуты безопасности.

        static void Main()
        {
            //Создаю почтовый ящик.
            IntPtr d;
            d=CreateMailslot (
                "\\\\.\\mailslot\\mymail", //имя почтового ящика.
                0,                       //длина сообщения произвольна.
                0,
                IntPtr.Zero
                );
            Console.WriteLine(d);
            if (Marshal.GetLastWin32Error() != 0)
            {
                Console.WriteLine("Почтовый ящик не создан" + Marshal.GetLastWin32Error());
            }
            else
            {
                Console.WriteLine("Почтовый ящик создан");
            }
            Console.ReadKey();
        }
    }
}
и
using System;
using System.Runtime.InteropServices;
 
namespace GetInfo
{
    class Program
    {
        [DllImport("KERNEL32.DLL",SetLastError=true)]
        static extern bool GetMailslotInfo(
               IntPtr hMailslot,      // дескриптор почтового ящика
               int lpMaxMessageSize,  // максимальная длина сообщения
               ref int lpNextSize,    // длина следующего сообщения
               IntPtr lpMessageCount, // количество сообщений
               IntPtr lpReadTimeout   // интервал ожидания сообщения
            );
        static void Main()
        {
            IntPtr hMailslot;
            int x;
            x = int.Parse(Console.ReadLine()); //сюда ввожу дескриптор ящика, полученный в предыдущем коде.
            hMailslot = (IntPtr)x;
            int lpMaxMessageSize;
            int lpNextSize;
            IntPtr lpMessageCount;
            IntPtr lpReadTimeout;
 
            lpMaxMessageSize = 0;
            lpNextSize = 0;
            lpMessageCount = (IntPtr)0;
            lpReadTimeout = (IntPtr)0;
 
            GetMailslotInfo(
                hMailslot,
                lpMaxMessageSize,
                ref lpNextSize,
                lpMessageCount,
                lpReadTimeout
                );
            if (Marshal.GetLastWin32Error()!=0)
            {
                Console.WriteLine("Ошибка " + Marshal.GetLastWin32Error());
            }
            else 
            {
                Console.WriteLine("Информация полученна");
            }
            Console.ReadKey();
        }
    }
}

Решение задачи: «GetMailslotInfo завершается с ошибкой»

textual
Листинг программы
[DllImport("...", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetMailslotInfo(IntPtr ..., out uint ..., out uint ..., out uint ..., out uint ...);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.533 из 5
Похожие ответы