我正在尝试使用以下代码列出加载到Processe的dll:
Process[] ObjModulesList = Process.GetProcessesByName("iexplore");
foreach (Process prc in ObjModulesList)
{
ProcessModuleCollection ObjModules = prc.Modules;
foreach (ProcessModule objModule in ObjModules)
{
string strModulePath = objModule.FileName.ToString();
Console.WriteLine(strModulePath);
}
}
我收到错误
32位进程无法访问64位进程的模块。
我尝试以管理员身份运行我的进程,并以64位和32位运行iexplore。没有人工作。
BTW,我必须将我的程序编译为32位。
有什么想法吗?
答案 0 :(得分:1)
您可以使用WMI,这是一段获取所有进程和相关模块的代码:
var wmiQueryString = string.Format("select * from CIM_ProcessExecutable");
Dictionary<int, ProcInfo> procsMods = new Dictionary<int, ProcInfo>();
using (var searcher = new ManagementObjectSearcher(string.Format(wmiQueryString)))
using (var results = searcher.Get())
{
foreach (var item in resMg.Cast<ManagementObject>())
{
try
{
var antecedent = new ManagementObject((string)item["Antecedent"]);
var dependent = new ManagementObject((string)item["Dependent"]);
int procHandleInt = Convert.ToInt32(dependent["Handle"]);
ProcInfo pI = new ProcInfo { Handle = procHandleInt, FileProc = new FileInfo((string)dependent["Name"]) };
if (!procsMods.ContainsKey(procHandleInt))
{
procsMods.Add(procHandleInt, pI);
}
procsMods[procHandleInt].Modules.Add(new ModInfo { FileMod = new FileInfo((string)antecedent["Name"]) });
}
catch (System.Management.ManagementException ex)
{
// Process does not exist anymore
}
}
}
在procsMods
我们已存储过程和模块,现在我们打印它们:
foreach (var item in procsMods)
{
Console.WriteLine(string.Format("{0} ({1}):", item.Value.FileProc.Name, item.Key));
foreach (var mod in item.Value.Modules)
{
Console.WriteLine("\t{0}", mod.FileMod.Name);
}
}
这些是ProcInfo
和ModInfo
类:
class ProcInfo
{
public FileInfo FileProc { get; set; }
public int Handle { get; set; }
public List<ModInfo> Modules { get; set; }
public ProcInfo()
{
Modules = new List<ModInfo>();
}
}
class ModInfo
{
public FileInfo FileMod { get; set; }
}
答案 1 :(得分:-1)
您必须使用x64目标编译应用程序。
否则你可以咨询: http://www.codeproject.com/Articles/301/Display-Loaded-Modules-v