我有一个32位应用程序,可以使用32或64位的应用程序,这取决于它运行的计算机。
我只希望一次运行第二个应用程序的一个实例,我需要第一个应用程序来阻止第二个应用程序多次启动。
我希望能够使用GetProcessesByName来获取正在运行的进程。这似乎工作正常。当我试图获取模块数据以找出第二个应用程序从哪个文件夹运行时,这些事情就会崩溃。
是否有人建议从32位应用程序中识别64位进程及其原始文件夹?
谢谢你, SH
答案 0 :(得分:0)
我认为如果在启动第二个应用程序时设置Mutex可能会更容易 在主应用程序中你可以这样做:如果Mutex不存在你运行第二个app(在运行时创建Mutex并在关闭时释放它),否则你跳过...
<强> EDITED 强>: 您无法编辑第二个应用程序以插入互斥锁的创建,确定 但您可以在主应用:
中执行此操作BackgroudWorker wrk
bool running = false
if (running) return; running = true;
running = false
只是一个想法......
再次编辑:
如果您关闭第一个应用并重新打开它,用户可以再次运行第二个应用
所以你可以这样做:
BackgroudWorker wrk
使用此方法,即使用户退出您的第一个应用程序,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