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 ...);