簡體   English   中英

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

[英]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 設置為 true: bool running = false
  • 當你希望新應用運行時執行 wrk: if (running) return; running = true; if (running) return; running = true;
  • wrk 創建一個 Process 並等待它的結束
  • 當 wrk 結束running = false

只是一個想法...

再次編輯:
如果您關閉第一個應用程序並重新打開它,用戶可以再次運行第二個應用程序。
所以你可以這樣做:

  • 創建后台工作者BackgroudWorker wrk
  • 寫一個 tmp 文件(在 NTFS 上它可以是空的)
  • 當您希望新應用運行時執行 wrk:
    如果您的 tmp 文件存在,則退出;
  • wrk 創建一個 Process 並等待它的結束
  • 當 wrk 結束時刪除 tmp 文件

使用此方法,即使用戶退出您的第一個應用程序,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM