Вы выделяете массив в стек внутри вашей функции recvmsg
. Возврат указателя на эту память в какой-то момент приведет к неопределенному поведению, если он будет разыменован, так как память будет очищена, когда функция выйдет.
Если вы хотите вернуть указатель в память, вам нужно будет распределите его динамически, используя malloc
.
К сожалению, вы не можете этого сделать. Единственный раз, когда вызывается вызывающее событие, вы вводите «exit» в приглашении PowerShell.
Вот как я подключаю свое выходное событие:
$null = Register-EngineEvent -SourceIdentifier `
([System.Management.Automation.PsEngineEvent]::Exiting) -Action { # Put code to run here }
Когда вы нажимаете кнопку X для закрытия, вы закрываете приложение, на котором размещается PowerShell. Это приложение должно будет обрабатывать ситуацию выхода. Я считаю, что хост PS по умолчанию - это консоль Windows, которая, очевидно, не делает то, что вам нужно. Вы можете разместить PowerShell в пользовательском хосте и обрабатывать события выхода. Я нахожусь на Mac прямо сейчас, но, возможно, работает под PS ISE, будет обрабатывать это для вас?
Необработанное исключение возникает из-за того, что сбор мусора уже установил ваш обработчик к моменту вызова неуправляемого метода. Вы можете обойти это, сохранив его в статическом поле:
private static HandlerRoutine s_rou;
public static void SetHandler()
{
if (s_rou == null)
{
s_rou = new HandlerRoutine(ConsoleCtrlCheck);
SetConsoleCtrlHandler(s_rou, true);
}
}