如何使用32位进程查找64位进程信息

时间:2011-05-02 20:17:48

标签: vb.net

我有一个32位应用程序,可以使用32或64位的应用程序,这取决于它运行的计算机。

我只希望一次运行第二个应用程序的一个实例,我需要第一个应用程序来阻止第二个应用程序多次启动。

我希望能够使用GetProcessesByName来获取正在运行的进程。这似乎工作正常。当我试图获取模块数据以找出第二个应用程序从哪个文件夹运行时,这些事情就会崩溃。

是否有人建议从32位应用程序中识别64位进程及其原始文件夹?

谢谢你, SH

2 个答案:

答案 0 :(得分:0)

我认为如果在启动第二个应用程序时设置Mutex可能会更容易 在主应用程序中你可以这样做:如果Mutex不存在你运行第二个app(在运行时创建Mutex并在关闭时释放它),否则你跳过...

<强> EDITED : 您无法编辑第二个应用程序以插入互斥锁的创建,确定 但您可以在主应用

中执行此操作
  • 创建后台工作人员BackgroudWorker wrk
  • 将私人布尔值设为true:bool running = false
  • 当您希望新应用运行时执行wrk:if (running) return; running = true;
  • wrk创建一个进程并等待其结束
  • 当wrk结束时running = false

只是一个想法......

再次编辑:
如果您关闭第一个应用并重新打开它,用户可以再次运行第二个应用 所以你可以这样做:

  • 创建后台工作人员BackgroudWorker wrk
  • 写一个tmp文件(在NTFS上它可以是空的)
  • 当您想要运行新应用时执行wrk:
     如果您的tmp文件存在,则退出;
  • wrk创建一个进程并等待其结束
  • 当wrk结束时删除tmp文件

使用此方法,即使用户退出您的第一个应用程序,tmp文件仍保留在硬盘驱动器上;因此,当用户再次运行第一个应用程序时,将不会执行第二个应用程序 请记住,如果用户智能足以解决这个问题,他可以手动删除文件并完成诀窍。
最后:您确定用户无法直接运行第二个应用程序吗?

答案 1 :(得分:0)

您可以使用WMI API(System.Management命名空间),特别是ManagementObjectSearcher。下面的示例显示从所有正在运行的记事本实例中获取进程ID和完整命令行。

Imports System.Management

Module Module1

    Sub Main()

        Dim wmi = New ManagementObjectSearcher("SELECT ProcessId, CommandLine FROM Win32_Process WHERE CommandLine LIKE ""%notepad%""")
        Dim result = wmi.Get().OfType(Of ManagementObject)()
        For Each r In result
            Console.WriteLine("Process ID: {0}, Command Line: {1}" r("ProcessId"), r("CommandLine"))
        Next
    End Sub

End Module