2011-05-16 68 views
0

所以......有人知道如何做到這一點?如何知道模塊是否加載到系統的任何進程? C#

我想在這樣的:

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; 
    } 

但它沒有工作,因爲每次返回true。即使模塊沒有加載到任何進程的內存中。

在此先感謝!

固定碼:

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; 
    } 
+0

你確定沒有加載?也許Visual Studio加載它:)當你在這段代碼中遇到命中時,輸出進程的名字,然後檢查使用一些外部工具,如進程管理器。 – mmix 2011-05-16 09:33:09

+0

@ mmix:老兄,我修改了代碼,現在完美地工作。 – 2011-05-16 10:05:50

回答

1

根據MSDN的Process.Modules屬性包含已經被加載模塊。因此,如果某個模塊不在模塊中,則不會加載該模塊。

+0

感謝您的回覆,但我調試代碼,發現錯誤,現在已修復。 – 2011-05-16 09:45:13

1

嗯,你總是可以使用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位進程的比特和塊,包括模塊列表。我發現你正在捕獲一個可能是我所說的異常,使得你的(和以上)代碼無效,因爲它不會枚舉所有進程。