2010-03-01 69 views
1

在我正在開發的應用程序中(在C中),必須首先在主應用程序執行前運行加載器應用程序。我已經做到了,主應用程序在啓動時運行加載器應用程序,以便自動完成此任務。這一切都運行良好,除了加載器應用程序只需要在用戶當前的登錄會話期間運行一次以便主應用程序正常工作,並且每次主應用程序執行時都必須運行該應用程序纔是真實的疼痛。所以我問的是:有沒有辦法檢查加載程序是否已經使用Windows或C功能運行? 理想情況下是這樣的將是巨大的,雖然我不知道,如果它甚至有可能:如何檢查當前登錄會話期間是否已執行程序? (Windows)

if(thisapp.exe hasBeenExecuted) 
    return; 
else 
    spawnl(app_path, app_name, args, NULL); 

或者可能像其主要的應用程序創建的運行程序的時候,充當一個標誌,一個虛擬文件。然後在後續執行中,檢查文件是否存在,如果沒有則運行加載程序。唯一的問題是將其自動化,以便在關閉計算機時刪除虛擬文件(是否有辦法執行此操作?)。

一些說明: 我不能編輯加載器應用程序或在主應用程序中複製其功能,我沒有寫它。

在此先感謝您的幫助

回答

1

您也可以使用原子功能,而無需讀/寫一個巨大的文件

http://msdn.microsoft.com/en-us/library/ms649053%28VS.85%29.aspx

+0

這完美地工作,謝謝!這在Windows XP中運行良好,但是您是否知道在其他Windows版本中功能是否發生了變化? –

+0

我猜測win32的東西在NT上是一樣的。原子一直回到Win 3.x,但我不記得是否有不同的參數。 試試這個(應該仍然在XP下工作) http://ghirai.com/hutch/files/win32hlp_big.zip –

2

有幾種方法可以做到這一點。

您的應用程序可能會添加一個條目到Run key。這使得它在用戶登錄時保證每個會話至少運行一次。在這種情況下,您可以將它傳遞給一個特殊的命令行參數arg以區別於重新啓動。

另一個選項可能是將您的狀態存儲在當前用戶配置單元中,並使用REG_OPTION_VOLATILE標誌創建密鑰。這會導致密鑰僅存儲在內存中,並且在配置單元卸載時不會刷新到磁盤,這應該在用戶註銷時進行。

0

過去我見過的一個建議是從加載用戶配置單元(即註冊表)運行應用程序,刪除文件(或者創建它)。優點是這可以像在啓動期間運行的shell腳本(批處理文件)一樣簡單(或者用戶配置文件加載,取決於您掛鉤的位置),並且在大多數情況下應該運行一次(在啓動時或在用戶登錄時)。如果您選擇登錄,則每次登錄後用戶登錄到計算機時都會運行(將)。

你也可以在用戶註銷時做到這一點,儘管這樣做的可靠性要差一些,因爲當配置單元卸載時(它可能會崩潰,沒電等),你並不總是知道機器的狀態。

它不是一個完整的證明方式,它只會在Windows上工作,但在大多數正常使用情況下,它會工作。

作爲一種替代技巧,您可以爲文件編寫時間戳,當您加載時,獲取時間戳並檢查其是否小於當前用戶已登錄的時間量。如果是,則可以跳過負載,因爲它很可能發生在當前用戶會話期間。

再次,這有一些缺點,但它應該工作得很好。

0

什麼是首先被運行加載的應用程序做的,這意味着它需要?

在我看來,正確的答案是檢查是否已完成,因爲這就是你真正關心的。其他任何事情都可能是脆弱的,並在角落案件中破裂。

0

我已經在過去使用互斥量來實現這一點。

例如:

int main(int argc, char argv[][]) 
{ 
    // if Mutex exists 
    // { 
    //  Don't allow a second instance to run: 
    //  Notify user, log something, etc. 
    //  return 0; 
    // } 
    // else 
    // { 
    //  Create Mutex, this is the first time running 
    // } 

    // Rest of your program runs from here . . . 
} 

-bn

相關問題