Место чтения нарушения доступа 0x0000000c - PullRequest
2 голосов
/ 08 июля 2010

В моем приложении я отключаю меню «Пуск», используя «LowLevelKeyboardProc». Но я получаю следующую ошибку при непрерывном нажатии клавиши табуляции. Ошибка ..

Необработанное исключение в 0x00352d58 в Timer_soosai.exe: 0xC0000005: доступ нарушение считывания местоположения 0x0000000c.

00352D58  mov         eax,dword ptr [ecx+0Ch] /*This is the line which

вызывает ошибку в дизассемблере. * /

Код:

[DllImport("user32", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        public static extern int SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId);
        [DllImport("user32", EntryPoint = "UnhookWindowsHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        public static extern int UnhookWindowsHookEx(int hHook);
        public delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);
        [DllImport("user32", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        public static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);
        public const int WH_KEYBOARD_LL = 13;

        /*code needed to disable start menu*/
        [DllImport("user32.dll")]
        private static extern int FindWindow(string className, string windowText);
        [DllImport("user32.dll")]
        private static extern int ShowWindow(int hwnd, int command);

        private const int SW_HIDE = 0;
        private const int SW_SHOW = 1;
        public struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        public static int intLLKey;

        public int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam)
        {
            bool blnEat = false;

            switch (wParam)
            {
                case 256:
                case 257:
                case 260:
                case 261:
                    //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key,
                    blnEat = ((lParam.vkCode == 9) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 0)) | ((lParam.vkCode == 91) && (lParam.flags == 1)) | ((lParam.vkCode == 92) && (lParam.flags == 1)) | ((lParam.vkCode == 73) && (lParam.flags == 0));
                    break;
            }

            if (blnEat == true)
            {
                return 1;
            }
            else
            {
                return CallNextHookEx(0, nCode, wParam, ref lParam);
            }
        }
        public void KillStartMenu()
        {
            int hwnd = FindWindow("Shell_TrayWnd", "");
            ShowWindow(hwnd, SW_HIDE);
        }

    private void Login_Load(object sender, EventArgs e)
        {
            intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);

        }

Может кто-нибудь, пожалуйста, помогите мне в этом случае. Большое спасибо заранее ..

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

Все ваши декларации P / Invoke неверны, используя int, где требуется IntPtr. Этот код действительно собирается взорвать на 64-битной версии Windows. Исправьте их, получив соответствующие объявления от pinvoke.net

1 голос
/ 08 июля 2010

Похоже, что вы разыменовываете NULL (то есть нулевой указатель) где-то.Хотя NULL не формально ноль, это на практике.(Это не фактическая разыменование нулевого указателя, потому что код предполагает, что там есть структура, начинающаяся там, и получает доступ к 4-му слову этой структуры.)

Проверьте, где вы вызываете код с нулевымили нулевой параметр.Также подумайте о том, чтобы сделать все вызовы низкоуровневым API закрытыми и обернуть их безопасными версиями, которые защищают все аргументы.Я не могу диагностировать намного больше, чем это;Вы еще не предоставили достаточно информации (ну, по крайней мере, me , чтобы сделать это; кто-то более опытный может помочь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...