[英]How to find 64-bit process info using a 32-bit process
我有一個 32 位應用程序,它可以為第二個應用程序提供外殼,該應用程序可以是 32 位或 64 位,具體取決於它所運行的計算機。
我只希望一次運行第二個應用程序的一個實例,並且我需要第一個應用程序來防止第二個應用程序多次啟動。
我希望能夠使用 GetProcessesByName 來獲取正在運行的進程。 這似乎工作正常。 當我嘗試獲取模塊數據以找出第二個應用程序從哪個文件夾運行時,事情就崩潰了。
有沒有人建議從 32 位應用程序中識別 64 位進程及其原始文件夾?
謝謝你,SH
我認為如果在啟動第二個應用程序時設置 Mutex 會更容易。
在主應用程序中,您可以這樣做:如果 Mutex 不存在,則運行第二個應用程序(運行時創建 Mutex 並在關閉時釋放它),否則您跳過...
已編輯:您不能編輯第二個應用程序來插入互斥鎖的創建,好的。
但是您可以在主應用程序中執行此操作:
BackgroudWorker wrk
bool running = false
if (running) return; running = true;
if (running) return; running = true;
running = false
只是一個想法...
再次編輯:
如果您關閉第一個應用程序並重新打開它,用戶可以再次運行第二個應用程序。
所以你可以這樣做:
BackgroudWorker wrk
使用此方法,即使用戶退出您的第一個應用程序,tmp 文件仍保留在硬盤上; 所以當用戶再次運行第一個應用程序時,第二個應用程序將不會被執行。
請記住,如果用戶足夠聰明,可以理解這一點,他可以手動刪除文件,然后技巧就完成了。
最后:您確定用戶不能直接運行第二個應用程序嗎?
您可以為此使用 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.