可靠地找到进程的路径...... Win XP,Vista和7

时间:2011-03-07 21:58:01

标签: vb.net memory process directory

所有

我研究过互联网,发现了一些潜在的解决方案,但我一直在Windows 7机器上出错。

这是独家新闻。我有一个用VB.NET编写的应用程序,用于启动控制台应用程序。控制台应用程序将独立于我的VB.NET应用程序运行,因此用户可以关闭并重新启动VB.NET应用程序,并可能从同一安装启动第二个控制台应用程序会话。

我不想要这个。我希望在我的VB应用程序启动时识别正在运行的控制台应用程序的实例,并禁用运行控制台应用程序的能力,第二,第三,等等。时间。但是......我只想在从与VB.NET应用程序相同的文件夹启动控制台应用程序时禁用此功能。

这是我目前正在使用的代码:    公共函数CheckForConsoleApp()As Boolean         '检查控制台应用程序是否在此文件夹中运行。如果是,请重新运行。

    Dim p() As System.Diagnostics.Process
    p = System.Diagnostics.Process.GetProcessesByName("MyConsoleApp")
    If p.Length = 0 Then return false

    Dim Path As String = My.Application.Info.DirectoryPath
    Dim i As Integer
    For i = 0 To p.Length - 1
        Dim pPath As String = p(i).MainModule.FileName
        pPath = pPath.Substring(0, pPath.LastIndexOf("\"))
        if pPath = Path Then Return True
    Next i

    Return False

End Function

在我的系统(32位Windows XP)上,这不是问题,每次都有效。在同事的64位Windows 7计算机上,会生成一个错误,只能完成“ReadProcessMemory或WriteProcessMemory”的一部分。使用日志文件和其他努力表明:

Dim pPath As String = p(i).MainModule.FileName

行是发生故障的地方。

我们的应用程序必须在32位和64位平台上运行Windows 7,Vista和XP计算机。我发现WinAPI命令将读/写权限应用于某些内存位置,但这些命令专门用于ReadProcessMemory API命令,因此我还没有看到如何在.NET中应用类似的命令。

帮助? 谢谢, SH

2 个答案:

答案 0 :(得分:2)

我不知道你是否找到了你的解决方案,但是你需要将你的构建选项设置为“任何CPU”而不是X86,那么它对我来说没问题。

答案 1 :(得分:0)

我一直在寻找这个问题的解决方案......甚至几周。我昨天放弃了希望并在这里发了一个问题,今天重新编写了我的搜索内容,发现了什么听起来像是答案。

它的要点是,寻找其他进程数据的进程是x86进程,并且正在尝试查找x64进程的数据。这就是我的申请失败的原因。有没有人有建议如何解决它?

http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/ca5fc242-fbc0-4b5b-be86-4cbd3824211b?prof=required

这是一个相当长的帖子,但是如果你搜索“Charl”(帖子的作者的名字),你会发现我认为我的问题的答案。它可能不适用于该问题的所有其他事件,但我认为这是我的事情。

SH