Ручка Powershell при закрытом событии, когда нажата кнопка «X» [дубликат]

Вы выделяете массив в стек внутри вашей функции recvmsg. Возврат указателя на эту память в какой-то момент приведет к неопределенному поведению, если он будет разыменован, так как память будет очищена, когда функция выйдет.

Если вы хотите вернуть указатель в память, вам нужно будет распределите его динамически, используя malloc.

7
задан JST 9 December 2011 в 12:37
поделиться

3 ответа

К сожалению, вы не можете этого сделать. Единственный раз, когда вызывается вызывающее событие, вы вводите «exit» в приглашении PowerShell.

Вот как я подключаю свое выходное событие:

 $null = Register-EngineEvent -SourceIdentifier `
     ([System.Management.Automation.PsEngineEvent]::Exiting) -Action { # Put code to run here }
2
ответ дан Aaron Jensen 19 August 2018 в 01:00
поделиться
  • 1
    с некоторой помощью других специалистов онлайн и amp; немного усилий я мог бы достичь этого с помощью следующего кода. – JST 9 December 2011 в 06:35
  • 2
    PS v3 подключил кнопку закрытия окна до выхода – Timbo 24 May 2013 в 22:56

Когда вы нажимаете кнопку X для закрытия, вы закрываете приложение, на котором размещается PowerShell. Это приложение должно будет обрабатывать ситуацию выхода. Я считаю, что хост PS по умолчанию - это консоль Windows, которая, очевидно, не делает то, что вам нужно. Вы можете разместить PowerShell в пользовательском хосте и обрабатывать события выхода. Я нахожусь на Mac прямо сейчас, но, возможно, работает под PS ISE, будет обрабатывать это для вас?

0
ответ дан Brian Lyttle 19 August 2018 в 01:00
поделиться
  • 1
    В любом случае, я не могу справиться с консольным приложением. Технически я предполагаю, что вы закрываете conhost, который завершает приложение, которое он размещает (в котором размещается PowerShell). – Joey 8 December 2011 в 21:46

Необработанное исключение возникает из-за того, что сбор мусора уже установил ваш обработчик к моменту вызова неуправляемого метода. Вы можете обойти это, сохранив его в статическом поле:

private static HandlerRoutine s_rou;

public static void SetHandler()
{
    if (s_rou == null)
    {
        s_rou = new HandlerRoutine(ConsoleCtrlCheck);
        SetConsoleCtrlHandler(s_rou, true);
    }
}
1
ответ дан JMacia 19 August 2018 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: