Как открыть несколько файлов с помощью программы Delphi, вызываемой через открытую оболочку - PullRequest
2 голосов
/ 01 марта 2009

Я сейчас использую:

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. путь к каждому файлу

Ответы [ 4 ]

6 голосов
/ 02 марта 2009

Помимо всего прочего, вы должны использовать% l вместо% 1. Таким образом, ваша программа получит полное (длинное) имя файла, а не короткое (DOS 8.3).

РЕДАКТИРОВАТЬ: ответ на вопрос Роба в комментариях

Кажется, что почти невозможно найти "% l" и "% 1" (включая знак процента), используя поиск Google или MSDN. :( Тем не менее, я нашел довольно хорошее описание в The Old New Thing - '% 1' автоматически определяет, поддерживает ли ваша программа длинные имена файлов и передает либо короткие, либо длинные имена. Кажется, что все современные системы носят длинное имя , если ваш exe не может быть найден (по крайней мере, так я понимаю разоблачение Раймонда).

Если прокрутить комментарии вниз (выполнить поиск «% l» на странице), вы найдете список всех поддерживаемых параметров, взятых с какой-то страницы, которая больше не существует (но я нашел старую копию в Интернет-архив ). На этой странице также нет ссылки на документацию Microsoft, поэтому я не могу дать вам официальную ссылку: (

Роб, спасибо за вопрос - теперь я знаю о% 1 /% l больше, чем раньше :) +1 за это.

5 голосов
/ 02 марта 2009

Если вы попытаетесь открыть несколько файлов одновременно, вы, как правило, получите несколько экземпляров зарегистрированной программы, каждый из которых открывает один из файлов.

Теперь, судя по вашим недавним вопросам

Как узнать, запущен ли один экземпляр моей программы?
Как отправить строку из одного экземпляра моей программы Delphi в другой?

вы не хотите разрешать несколько экземпляров программы, поэтому вам нужно будет либо пересмотреть это проектное решение, либо реализовать один из способов, описанных в ответах на второй вопрос, для отправки параметра командной строки вторичных экземпляров вашей программы в первую очередь. Обратите внимание, что здесь важно время, потому что первый экземпляр может быть еще не готов к приему данных из других экземпляров. Особенно в решениях, использующих дескриптор окна основной формы или какой-либо другой механизм связи на основе канала или файла, будет ожидание готовности первого экземпляра. Поэтому может быть намного проще просто разрешить несколько экземпляров программы.

Вы также можете просмотреть эту запись базы знаний Майкрософт или выполнить поиск дополнительной информации о команде DDE Execute .

Редактировать: Вы также можете попробовать использовать «% *» вместо «% 1» в разделе реестра, как подробно описано в комментарии «Старая новая вещь» ответ от gabr упомянуто. Я не проверял это, но похоже, что это может сработать.

0 голосов
/ 02 марта 2009

Замечу, что вы регистрируете его только с% 1.

Я бы попробовал% 1% 2% 3% 4% 5 и т. Д. В реестре.

Я никогда не играл с расширениями оболочки, чтобы посмотреть, что еще может привести к сбою. Все, что я сделал, это зарегистрировал ассоциации файлов, и они ведут себя именно так, как я ожидал.

0 голосов
/ 02 марта 2009

Не уверен, что вы действительно хотите. Но вы можете найти количество параметров с:

ParamCount;

Каждый параметр затем найден с

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

До ParamCount.

...