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 ...);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д