问题
2009年5月31日星期日 上午8:38
新手刚接触 C# 遇到问题,希望得到高手解答:
一小段代码,用于遍历所有进程的所有模块,找到其中的 ABC.DLL 模块。部分代码如下:
public class GetModule
{
public bool GetModule_Name()
{
foreach(Process LiveProc in Process.GetProcesses())
{
ProcessModuleCollection modules = LiveProc.Modules; //<-- 此行有错误??没有权限?
foreach(ProcessModule BadModule in modules)
{
if(BadModule.ModuleName == "ABC")
return true;
}
}
return false;
}
}
************** 异常文本 **************
System.ComponentModel.Win32Exception: 拒绝访问。
在 System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
在 System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)
在 System.Diagnostics.ProcessManager.GetModuleInfos(Int32 processId)
在 System.Diagnostics.Process.get_Modules()
......
新手问题,希望高手解答,谢谢!
全部回复 (5)
2009年5月31日星期日 上午9:00 ✅已答复 | 1 票
新手刚接触 C# 遇到问题,希望得到高手解答:
一小段代码,用于遍历所有进程的所有模块,找到其中的 ABC.DLL 模块。部分代码如下:
public class GetModule
{
public bool GetModule_Name()
{
foreach(Process LiveProc in Process.GetProcesses())
{
ProcessModuleCollection modules = LiveProc.Modules; //<-- 此行有错误??没有权限?
foreach(ProcessModule BadModule in modules)
{
if(BadModule.ModuleName == "ABC")
return true;
}
}
return false;
}
}
************** 异常文本 **************
System.ComponentModel.Win32Exception: 拒绝访问。
在 System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
在 System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)
在 System.Diagnostics.ProcessManager.GetModuleInfos(Int32 processId)
在 System.Diagnostics.Process.get_Modules()
......
新手问题,希望高手解答,谢谢!
class Program
{
static void Main(string[] args)
{
//Service1 service = new Service1();
//Console.WriteLine(service.HelloWorld());
//Console.WriteLine(service.GetFullName("Raymond"));
//Console.Read();
Console.WriteLine(GetModuleName("QQ.exe"));
Console.ReadLine();
}
private static bool GetModuleName(string name)
{
Console.WriteLine("get module name :"+name);
{
foreach (Process LiveProc in Process.GetProcesses())
{
try
{
ProcessModuleCollection modules = LiveProc.Modules;
foreach (ProcessModule BadModule in modules)
{
if (BadModule.ModuleName == name)
{
Console.WriteLine("succeed!"+name);
return true;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message+LiveProc.ProcessName);
continue;
}
}
return false;
}
}
}
运行结果:
get module name :QQ.exe
拒绝访问。svchost
拒绝访问。svchost
拒绝访问。csrss
拒绝访问。MsDtsSrvr
拒绝访问。svchost
succeed!QQ.exe
True
努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
2009年5月31日星期日 上午8:41
有几个进程是不能如此访问的 比如system idle 你要把这样的进程记下来 然后跳过
紫柔版主的头像真叫萌得一个不行啊。。。。
2009年5月31日星期日 上午8:47
foreach (Process LiveProc in Process.GetProcesses())
{
try
{
ProcessModuleCollection modules = LiveProc.Modules; //有些是没有权限访问的,做个 try catch
foreach (ProcessModule BadModule in modules)
{
if (BadModule.ModuleName == "ABC") return true;
}
}
catch
{
//
}
}
知识改变命运,奋斗成就人生!
2009年5月31日星期日 上午8:49
有 Try Catch,弹出的异常就是:拒绝访问。
2009年5月31日星期日 上午9:12
多谢楼上兄弟的回复,回去测试一下。