Как узнать, загружен ли модуль в какой-либо процесс системы? C # - PullRequest
0 голосов
/ 16 мая 2011

Итак ... кто-то знает, как это сделать?

Я думал о чем-то вроде:

    private bool IsModuleLoaded(String ModuleName)
    {
        bool loaded = false;
        Process[] processes = Process.GetProcesses();
        ProcessModule myProcessModule = null;
        ProcessModuleCollection myProcessModuleCollection;

        for (int i = 0; i < processes.Length; i++)
        {
            try
            {
                myProcessModuleCollection = processes[i].Modules;

                for (int j = 0; j < myProcessModuleCollection.Count; j++)
                {
                    myProcessModule = myProcessModuleCollection[j];

                    if (myProcessModule.ModuleName.Contains(ModuleName))
                    {
                        loaded = true;
                        break;
                    }
                }

            }
            catch { loaded = false; }
        }

        return loaded;
    }

Но это не работает, потому что каждый раз возвращает истину. Даже если модуль не загружен в память какого-либо процесса.

Заранее спасибо!.

ФИКСИРОВАННЫЙ КОД:

    private bool IsModuleLoaded(String ModuleName)
    {
        bool loaded = false;
        Process[] processes = Process.GetProcesses();
        ProcessModule myProcessModule = null;
        ProcessModuleCollection myProcessModuleCollection;

        for (int i = 0; i < processes.Length; i++)
        {
            try
            {
                myProcessModuleCollection = processes[i].Modules;

                for (int j = 0; j < myProcessModuleCollection.Count; j++)
                {
                    myProcessModule = myProcessModuleCollection[j];

                    if (myProcessModule.ModuleName.Contains(ModuleName))
                    {
                        loaded = true;
                        break;
                    }
                }
            }
            catch { loaded = false; }
            if (loaded)
                break;
        }

        return loaded;
    }

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Ну, вы всегда можете использовать linq, чтобы помочь вам в этом, он вырвется, как только прозвучит имя

    private bool IsModuleLoaded2(String ModuleName)
    {
        var q = from p in Process.GetProcesses()
                from m in p.Modules.OfType<ProcessModule>()
                select m;
        return q.Any(pm => pm.ModuleName.Contains(ModuleName));
    }

Кроме того, имейте в виду, что если вы работаете на 64-битной платформе, выДОЛЖЕН запускать это внутри 64-битного процесса.32-битный процесс не может получить доступ к битам и частям 64-битного процесса, включая список модулей.Я вижу, что вы ловите исключение, о котором я, вероятно, говорю, что делает ваш (и выше) код недействительным, поскольку он не будет перечислять все процессы.

1 голос
/ 16 мая 2011

Согласно MSDN, свойство Process.Modules содержит модули, которые уже были загружены .Поэтому, если модуль отсутствует в коллекции Modules , он не загружается.

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