не удалось получить все процессы .. исключение win32, как это исправить? - PullRequest
0 голосов
/ 28 февраля 2012

я создаю приложение диспетчера задач (сервер-клиент) .. поэтому я получаю список процессоров с сервера в виде строки.
моя проблема в том, что 60-65% процессоров не удалось получить на стороне сервера, как вы видите на снимке диспетчера задач. Обратите внимание, что приложение сервера отлажено как администратор
Код сервера:

public void GetProcessors()
    {
        int i =0,j = 0;
        string answer = "";
        foreach (Process p in Process.GetProcesses())
        {
            try
            {
                answer += p.MainModule.ModuleName
                + "|" + p.Id.ToString()
                + "|" + string.Format("{0:N0} K", p.WorkingSet64 / 1024)
                + "|" + p.MainModule.FileVersionInfo.FileDescription;
                i++;
                answer += "?";
            }
            catch 
            {
                j++;
            }
        }
        answer = answer.Remove(answer.Length - 1, 1);
        send(string.Format("get<{0}<{1}<{2}", answer, i, j));
    }

Клиентская сторона: это вызвало метод getProcessors из класса менеджера задач

switch(command[1])
                    {
                        case "get":
                            Console.WriteLine(command[2]);
                            if (InvokeRequired)
                            {
                                Action a = () => taskManager1.GetProcessors(command[2], command[3], command[4]);
                                Invoke(a);
                            }
                            break;
                        default:
                        break;
                    }

(на стороне клиента) КЛАСС УПРАВЛЕНИЯ ЗАДАЧАМИ:

public void GetProcessors(string cmd,string success,string fail)
    {
        string[] Processors = cmd.Split('?');
        foreach (string process in Processors)
        {
            string[] info = process.Split('|');
            if (info.Length < 4)
            {
                MessageBox.Show(info.Length.ToString());
                continue;
            }
            ListViewItem item = new ListViewItem(info[0]);
            item.SubItems.Add(info[1]);
            item.SubItems.Add(info[2]);
            item.SubItems.Add(info[3]);
            listView1.Items.Add(item);
        }
        labelProcess.Text = string.Format("Processors: {0}", success);
        failedLabel.Text = string.Format("Failed: {0}", fail);
    }

enter image description here

я получил эти исключения 85 СБОЙ: 83 являются {"32-битные процессы не могут получить доступ к модулям 64-битных процессов."}
остальные 2 СБОИ: {"Невозможно перечислить модули процесса."}

после того, как я отредактировал код и попытался запустить его без использования Process.MainModule .. он дает мне:
process: 147 .. FAIL: 0 .. так почему я не могу получить доступ к process.MainModule?

Как мне это исправить ??

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Первая ошибка не требует пояснений.Вам нужно использовать 64-битный API-интерфейс Windows, поэтому вам нужно создать 64-битную версию вашего инструмента.

Вторая ошибка очень загадочная.Некоторые прибегали к поиску в Google: «Вы не сможете получить доступ к свойству MainModule для некоторых процессов (запущенных с использованием учетных данных SYSTEM) или для встроенного процесса« Система ».» Это ожидаемая ошибка.

0 голосов
/ 28 февраля 2012

После того, как я изменил мой отладчик приложений на x64, он работает ... но я думаю, теперь мне нужно сделать две копии: 32-битную и 64-битную
... enter image description here

...