2009-03-01 74 views
2

我目前使用的德爾福調用程序:如何打開多個文件並通過shell開放

if ParamStr(1)<>'%1' then 
begin 
    address.Text:=ParamStr(1); 
    autoconfigfile; 
end; 

拿起這是用來通過文件關聯到打開該文件的文件名。

我現在想開發對多個文件進行操作的能力。 也就是說如果我選擇5個文件並右鍵單擊並選擇使用「EncryptionSystem」打開。 我有註冊表項:

reg.OpenKey('*\shell\Encrypt\command', true); 
    reg.WriteString('','C:\Program Files\EncryptionSystem\EncryptionSystem.exe "%1"'); 
    reg.CloseKey; 

要添加一個右擊打開的能力,所有文件。那麼我想的能力來檢測

  1. 多少文件
  2. 每個文件
+0

我發現答案只是沒有使用dde作爲初始位,因爲如果所有實例一起調用,第一個實例不會從第二個實例收回消息。給我自己的共享內存空間實施這個工作很好。 – Arthur 2009-03-04 09:40:27

+0

不是一個答案,但同樣的問題: 我沒有列入我的註冊表文件的擴展名,但是當我在一個窗口中選擇多個文件,並使用「打開方式」選擇我的程序打開它們,命令行似乎只包含一個文件名。你知道如何找到其他文件名嗎? Dave S – 2011-01-23 17:15:12

回答

5

如果您嘗試一次打開多個文件,您通常會獲得註冊程序的多個實例,每個實例都打開其中一個文件。

現在從你最近的問題來看

How do i tell if one instance of my program is running?
How do I send a string from one instance of my Delphi program to another?

你不希望允許該程序的多個實例,所以你要麼需要重新考慮設計決策,或實現的一個第二個問題的答案中概述的方法將第二個實例的命令行參數發送給第一個實例。請注意,時間在這裏很重要,因爲第一個實例可能還沒有準備好從其他實例接收數據。特別是使用主窗體的窗口句柄的解決方案,或者某種形式的基於管道或文件的通信機制將涉及等待第一個實例準備就緒。因此,簡單地允許程序的多個實例可能容易得多。

您可能還想研究this Microsoft Knowledge Base entry或搜索有關DDE執行命令的更多信息。

編輯:您也可以嘗試用「%*」,而不是「%1」中的註冊表項,如中提到的「舊的新」的評論the answer by gabr詳細說明。我沒有測試過這個,但它看起來可以工作。

+0

%*看起來是我想要的一個,當我回家時會測試它,這是否提供了「〜」的長名稱或dos 8.3版本 – Arthur 2009-03-03 15:42:44

0

不知道你真正想要什麼的路徑名。但你可以找到的參數與號碼:

ParamCount; 

每個參數是然後用

ParamStr(1); 
ParamStr(2); 
ParamStr(3); 

直到ParamCount發現。

+0

paramcount傳遞的參數數加在文件名的末尾.. apon打開5個文件只有1個參數。 – Arthur 2009-03-01 22:24:17

0

我注意到你只註冊了%1。

我會嘗試在註冊表中%1%2%3%4%5等。

我從來沒有玩過shell擴展,看看還有什麼可能導致失敗。我所做的只是註冊文件關聯,它們的行爲完全如我所料。

6

除了其他所有內容,您應該使用%l而不是%1。這樣你的程序將得到一個完整的(長)文件名,而不是簡短的(DOS 8.3)。

編輯:在評論

的答案羅布的問題看來,這幾乎是不可能的搜索「%L」和「%1」(包括百分號)或者使用谷歌或MSDN搜索。 :(但是,我在 The Old New Thing - '%1'中發現了一個相當不錯的描述,它可以自動檢測你的程序是否支持長文件名並傳遞了短名或長名,似乎所有現代系統都會傳遞長名,除非找不到exe文件(至少我是這麼理解雷蒙德的曝光)

如果你在評論中進一步向下滾動(在頁面上搜索'%l'),你會找到所有支持參數的列表, (但我在Internet Archive中發現了一箇舊副本)該頁面不包含任何對Microsoft文檔的引用,所以我不能給你一個權威鏈接:(

羅布,感謝問 - 我現在對%1 /%l的瞭解比以前更多:) +1。