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

StackOverflow https://stackoverflow.com/questions/600490

Вопрос

В настоящее время я использую:

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. путь к каждому файлу
Это было полезно?

Решение

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

Судя по вашим недавним вопросам

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

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

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

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

Другие советы

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

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

Кажется, что почти невозможно найти «%l» и «%1» (включая знак процента) с помощью поиска Google или MSDN.:( Однако я нашел довольно хорошее описание вСтарая новая вещь - '%1' автоматически определяет, поддерживает ли ваша программа длинные имена файлов, и передает короткое или длинное имя.Кажется, что все современные системы имеют длинное имя. если ваш exe не может быть найден (по крайней мере, я так понимаю разоблачение Рэймонда).

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

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

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

ParamCount;

Затем каждый параметр находится с помощью

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

До ПарамКаунта.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top