2016-07-15 119 views
0

短版: 在Windows上,如果我在文件瀏覽器中選擇幾個.txt文件,然後右鍵單擊選中的文件之一,並選擇「打開」,從彈出菜單中,將打開所有選定的文件,每個文件都在記事本的單獨實例中。打開多個實例

我希望我們的文件/編輯器相同的行爲:選擇多個輸出文件,右鍵點擊一個,選擇打開 - >所有文件被打開,各自在自己的我們的編輯的實例。

我有基本的點擊開放的工作(單個文件,雙擊打開了我們的編輯的文件,點擊右鍵,打開不一樣的)。

詳細

我們有一個啓動器(FuBarStudioLauncher.exe),更新然後啓動我們的編輯工具(FuBarStudio.exe),其產生與自定義擴展的資源文件(samplefile.fbr)

如果您在命令行中運行,您可以火起來的編輯器,打開一個特定的資源:

C:\path_to_my_exe\FuBarStudio.exe" -ide samplefile.fbr 

我有一個Windows註冊表項設置,這樣,當我雙擊一個名爲* .fbr [R esource文件,或右鍵單擊並從彈出菜單中選擇Open,啓動程序運行,將給定資源傳遞給編輯器。

相關注冊表項:

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\.fbr] 
@="FuBar.Place" 

[HKEY_CLASSES_ROOT\.fbr\FuBar.Place] 

[HKEY_CLASSES_ROOT\.fbr\FuBar.Place\ShellNew] 

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\FuBar.Place] 
@="FuBar Place" 

[HKEY_CLASSES_ROOT\FuBar.Place\shell] 

[HKEY_CLASSES_ROOT\FuBar.Place\shell\Open] 
@="Open" 

[HKEY_CLASSES_ROOT\FuBar.Place\shell\Open\command] 
@="\"C:\\path_to_my_exe\\FuBarStudioLauncher.exe\" -ide \"%1\"" 

所有這一切工作正常,單個文件。

如果我選擇多個文件.fbr,然後右鍵單擊選中的文件之一,並選擇「打開」,我只會開FUBAR工作室的一個實例。

我想打開一個FuBar Studio副本,每個文件一個。

回答

0

所以在一些幫助我得到了一個有用的答案。

1)我在使用MultiSelectModel這裏讀了起來: https://msdn.microsoft.com/en-us/library/windows/desktop/hh127436(v=vs.85).aspx

設置我的類型的文件。

2)我創建了一個批處理腳本作爲中介,所以我可以看得更清楚發生了什麼事情:

[HKEY_CLASSES_ROOT\FuBar.Place\shell\Open\command] 
@="\"C:\\path_to_my_exe\\launcher.bat\" \"%1\"" 

這個腳本週圍戲弄了,寫東西。tmp文件:

echo "interesting things" >> logs.txt 

並使用超時強制事件暫停/減速:

timeout 10 

使用「回聲」等我意識到d是MultiSelectModel是否設置爲文件或播放器,當我選擇多個文件並右鍵單擊「打開」時,Windows在執行業務:

HKEY_CLASSES_ROOT\FuBar.Place\shell\Open\command 

每個選定的文件一次。

我無法找到強制Windows調用該命令一次的方法,將所有文件作爲參數傳遞給該命令。

3)通過試驗除我自己以外的其他程序,並通過腳本+超時給我一個錯誤噴出的命令外殼,我意識到我的特定程序FuBarStudioLauncher.exe總是失敗,如果另一個實例是運行。

因此,這裏是我有:

  • 的Windows將運行每個輸入文件的<something>一個實例。
  • <something>不能是我的FuBarStudioLauncher.exe,因爲一旦運行後下N將會失敗。

所以我需要一箇中介腳本來做某種臨界區域鎖定: - 抓取鎖定。 - 運行啓動器完成。 - 釋放鎖定。

萬歲的StackOverflow:

Semaphore for CMD instances working in Parallel

以此爲輸入,我的最終產品:

:lockedAppend 
2>nul (
    >>%~dp0launcher_script_lockfile.txt (
     REM Do any amount of processing within this block. 
     REM All stdout will safely be appended to the queue 
     REM You could even call out to a subroutine, or another batch file 

     %~dp0FuBarStudioLauncher.exe -ide "%1" 
     REM The CALL below ensures that the block exits with ERRORLEVEL 0 - success 
     (call) 
    ) 
) || goto :lockedAppend 

這做到了!