我正在创建一个任务管理器应用程序(服务器 - 客户端)..所以我从服务器获取处理器列表作为字符串。我的问题是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;
}
(客户端)TASK MANAGER CLASS:
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);
}
我得到了那些例外 85 FAILS:83是{“32位进程无法访问64位进程的模块。”} 另外两个失败:{“无法枚举过程模块。”}
在我编辑代码并尝试在不使用Process.MainModule的情况下运行它之后,它给了我:
过程:147 ..失败:0 ..那么为什么我无法访问process.MainModule?
答案 0 :(得分:1)
第一个错误是不言自明的。您需要使用Windows的64位API,因此您需要构建一个64位版本的工具。
第二个错误非常神秘。一些谷歌搜索出现了«你将无法访问某些进程(在SYSTEM凭据下运行的进程)或内置“系统”进程的MainModule属性。»这是一个预期的错误。
答案 1 :(得分:0)
在我将我的应用程序调试器更改为x64后,它可以工作..但我认为现在我必须制作32位和64位的两份副本...