Pergunta

Atualmente estou usando:

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

Para captar o nome do arquivo que foi usado para abrir o arquivo com a associação de arquivos.

Agora, quero desenvolver a capacidade de operar em vários arquivos. Ou seja, se eu selecionar 5 arquivos e clicar com o botão direito do mouse e selecione Abrir com "Encrypionsystem". Eu tenho a entrada do registro:

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

Para adicionar um botão direito do clique em abrir a habilidade a todos os arquivos. Eu então gostaria da capacidade de detectar

  1. quantos arquivos
  2. o nome do caminho de cada arquivo
Foi útil?

Solução

Se você tentar abrir vários arquivos ao mesmo tempo, geralmente receberá várias instâncias do programa registrado, cada uma abrindo um dos arquivos.

Agora, a julgar por suas perguntas recentes

Como faço para dizer se uma instância do meu programa está em execução?
Como envio uma string de uma instância do meu programa Delphi para outro?

Você não deseja permitir várias instâncias do programa; portanto, precisará reconsiderar essa decisão de design ou implementar uma das maneiras descritas nas respostas à segunda pergunta para enviar o parâmetro da linha de comando das instâncias secundárias do seu programa para a primeira instância. Observe que o tempo é importante aqui, porque a primeira instância pode ainda não estar pronta para receber os dados de outras instâncias. Especialmente com soluções usando o identificador da janela do formulário principal, ou alguma forma de mecanismo de comunicação baseado em tubos ou arquivos, envolverá a espera de que a primeira instância esteja pronta. Portanto, pode ser muito mais fácil simplesmente permitir várias instâncias do programa.

Você também pode querer olhar para Esta entrada da Base de Conhecimento da Microsoft ou procure mais informações sobre o DDE Execute comando.

Editar: Você também pode tentar com "%*" em vez de "%1" na chave do registro, conforme detalhado no comentário "Old New Thing" A resposta de Gabr mencionado. Eu não testei isso, mas parece que poderia funcionar.

Outras dicas

Além de tudo o mais, você deve usar %L em vez de %1. Dessa forma, seu programa terá um nome completo (longo) do arquivo, não o curto (DOS 8.3).

Editar: uma resposta para a pergunta de Rob nos comentários

Parece que é quase impossível pesquisar por '%L' e '%1' (incluindo sinal percentual) usando a pesquisa do Google ou MSDN. :( no entanto, encontrei uma boa descrição emA velha coisa nova - '%1' automatiza se o seu programa suporta nomes de arquivos longos e passa o nome curto ou longo. Parece que todos os sistemas modernos passam o nome longo A menos que seu exe não possa ser encontrado (Pelo menos é assim que eu entendo a exposição de Raymond).

Se você rolar mais adiante nos comentários (pesquise '%L' na página), encontrará uma lista de todos os parâmetros suportados, retirados de alguma página que não existe mais (mas eu encontrei uma cópia antiga no Arquivo da Internet). Essa página também não inclui nenhuma referência à documentação da Microsoft, então não posso lhe dar um link autoritário :(

Rob, obrigado por perguntar - agora sei mais sobre %1/ %L do que antes :) +1 por isso.

Não tenho certeza do que você realmente quer. Mas você pode encontrar o número de parâmetros com:

ParamCount;

Cada param é então encontrado com

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

Até paramCount.

Observo que você está registrando apenas com %1.

Eu tentaria %1 %2 %3 %4 %5 etc no registro.

Nunca brinquei com extensões de shell para ver o que mais pode estar fazendo com que isso falhe. Tudo o que fiz é associações de arquivos registradas e elas se comportam exatamente como eu esperaria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top