2011-05-02 89 views
0

我有一個32位應用程序,它可以根據運行的計算機運行第32或64位應用程序。如何使用32位進程查找64位進程信息

我只希望一次運行第二個應用程序的一個實例,並且我需要第一個應用程序來防止第二個應用程序多次啓動。

我想能夠使用GetProcessesByName來獲取正在運行的進程。這似乎工作正常。這是當我試圖獲取模塊數據,以找出哪些文件夾的第二個應用程序運行,從事情崩潰。

有沒有人有建議從32位應用程序中識別64位進程及其原始文件夾?

謝謝 SH

回答

0

我覺得如果你啓動第二應用程序時設置的互斥它可能是更容易。
在主應用程序,你可以這樣做:如果互斥鎖不存在運行第二應用(運行時創建互斥和關閉時釋放),否則你跳過...

EDITED: 可以不要編輯第二個應用程序來插入互斥體的創建,好的。
但是你可以在主要應用做到這一點:

  • 創建一個後臺工作BackgroudWorker wrk
  • 設置一個私人布爾爲true:bool running = false
  • 當你想在新的應用程序運行執行WRK:if (running) return; running = true;
  • wrk創建一個Process並等待其結束
  • 當wrk結束時running = false

只是一個想法...

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

  • 創建一個後臺工作BackgroudWorker wrk
  • 寫tmp文件(在NTFS可以爲空)
  • 當你想在新的應用程序運行執行WRK:
    如果你的tmp文件存在然後退出;
  • WRK創建用於其端
  • 一個過程,並且等待時WRK結束刪除tmp文件

使用這種方法,即使用戶退出第一個應用程式,tmp文件仍保留在HDD;所以當用戶再次運行第一個應用時,第二個應用將不會被執行。
請記住,如果用戶是智能足以undestand這個,他可以manully刪除文件和訣竅完成。
最後:你確定用戶不能直接運行第二個應用程序?

+0

我已經在其他應用程序中完成了這項工作。我無法編輯第二個應用程序。完全取決於第一個應用程序來識別流程並確定從特定文件夾啓動哪些流程(如果有)。 – Superhuman 2011-05-02 21:06:50

+0

對不起,我沒有意識到你無法編輯第二個應用程序。 – Marco 2011-05-02 21:08:39

+0

我認爲我的解決方案更安全,然後檢查流程,因爲要做到這一點,您**必須是管理員(並且可能隱藏某個流程) – Marco 2011-05-02 21:20:47

0

您可以對此使用WMI API(System.Management名稱空間),特別是ManagementObjectSearcher。下面的示例顯示從所有正在運行的記事本實例中獲取進程標識和完整命令行。

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 
+0

你確定上面顯示的代碼,當作爲32位進程的一部分運行時,可以從64位進程獲取信息?我試着輸入你的代碼,但收到語法錯誤。我完全不熟悉WMI API。 – Superhuman 2011-05-14 04:50:16

相關問題