none
Ошибка при инициализации приложения (0xc0000142).

    Question

  • Здравствуйте. В своей программе для выключения ПК я использую следующую команду (язык C#):

    System.Diagnostics.Process.Start("shutdown.exe", "/s /f /t 0");

    Но дело в том, что при запуске данной функции в Windows XP возникает ошибка "Ошибка при инициализации приложения (0xc0000142).". При этом в системе Windows Seven (Windows 7) все работает абсолютно нормально.

    Не могли бы Вы, пожалуйста, подсказать команду, которая будет выполнятся в системах Windows XP, Windows Vista, а так же Windows Seven без ошибок?


    private void tShutdown_Tick(object sender, EventArgs e)
            {
                if (ASumm > 0) //если Сумма > 0, то
                {
                    ASumm = ASumm - 1; // вычитаем еденицу
                    statistic.Text = "ПК будет выключен через " + ASumm + " секунд"; //пишем, сколько осталось до выключения
                }
                else  //иначе 
                {
                    System.Diagnostics.Process.Start("shutdown.exe", "/s /f /t 0"); //выключаем
                    // statistic.Text = "А тут комп выключается...";
                }
            }

    Saturday, March 31, 2012 1:57 PM

Answers

  • Вот посмотрите, как раз на Вашу тему. Вот ещё, информация по этой ошибке.

    Saturday, March 31, 2012 2:47 PM
  • Примерно так, попробуйте.

    [DllImport("Powrprof.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
    public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent);
    // Спящий
    SetSuspendState(true, true, true);
    // Ждущий
    SetSuspendState(false, true, true);
    

    Saturday, March 31, 2012 3:21 PM

All replies

  • Этот код должен работать и в Windows XP тоже, а вот в Windows 2000 и более старых версиях нет. Это ошибка обычно появляется при неудачной инициализации dll файла. Может у Вас там что-то не правильно удалено, установлено или вирусы есть, или были (они тоже "любят такое вытворять"). Скорее всего дело именно в той операционке на которой запускаете, попробуйте если есть возможность, запустить на другой Xp.


    Saturday, March 31, 2012 2:36 PM
  • Хм...

    Microsoft Windows XP [Версия 5.1.2600]
    (С) Корпорация Майкрософт, 1985-2001.

    Вирусов нету, система вроде нормально работает...

    К сожалению на другой xp нет возможности проверить.

    А какие-либо другие способы есть?

    Saturday, March 31, 2012 2:40 PM
  • Вот посмотрите, как раз на Вашу тему. Вот ещё, информация по этой ошибке.

    Saturday, March 31, 2012 2:47 PM
  • Спасибо. По первой ссылке нашел информацию необходимую:

    using System.Runtime.InteropServices;
    
    [StructLayout(LayoutKind.Sequential, Pack=1)]
    internal struct TokPriv1Luid
    {
        public int Count;
        public long Luid;
        public int Attr;
    }
    
    [DllImport("kernel32.dll", ExactSpelling=true) ]
    internal static extern IntPtr GetCurrentProcess();
    
    [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
    internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr
    phtok );
    
    [DllImport("advapi32.dll", SetLastError=true) ]
    internal static extern bool LookupPrivilegeValue( string host, string name,
    ref long pluid );
    
    [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
    internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall,
    ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen );
    
    [DllImport("user32.dll", ExactSpelling=true, SetLastError=true) ]
    internal static extern bool ExitWindowsEx( int flg, int rea );
    
    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
    internal const int TOKEN_QUERY = 0x00000008;
    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
    internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
    internal const int EWX_LOGOFF = 0x00000000;
    internal const int EWX_SHUTDOWN = 0x00000001;
    internal const int EWX_REBOOT = 0x00000002;
    internal const int EWX_FORCE = 0x00000004;
    internal const int EWX_POWEROFF = 0x00000008;
    internal const int EWX_FORCEIFHUNG = 0x00000010;
    
    private void DoExitWin( int flg )
    {
        bool ok;
        TokPriv1Luid tp;
        IntPtr hproc = GetCurrentProcess();
        IntPtr htok = IntPtr.Zero;
        ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok );
        tp.Count = 1;
        tp.Luid = 0;
        tp.Attr = SE_PRIVILEGE_ENABLED;
        ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid );
        ok = AdjustTokenPrivileges( htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero );
        ok = ExitWindowsEx( flg, 0 );
        }
    

    Ну и подключал при помощи
    DoExitWin( EWX_SHUTDOWN );
    
    DoExitWin( EWX_REBOOT );
    

    Но хотел бы спросить еще: как-то можно переводить ПК в ждущий режим?

    Saturday, March 31, 2012 3:14 PM
  • Примерно так, попробуйте.

    [DllImport("Powrprof.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
    public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent);
    // Спящий
    SetSuspendState(true, true, true);
    // Ждущий
    SetSuspendState(false, true, true);
    

    Saturday, March 31, 2012 3:21 PM
  • По второй ссылке Microsoft Serurity Essential ругается что iframe эксплойт на странице. Изменил ссылку.


    Для связи [mail]

    Monday, April 02, 2012 6:55 AM