Back-End

13 jul, 2007

Associando uma Extensão ao Aplicativo

Publicidade

Venho escrever este artigo, pois há pouco tempo precisei realizar isso de forma profissional e foi muito difícil achar informações completas na internet. Muitos sites explicavam pequenas partes do processo, porém não mostravam como realizar a associação de maneira funcional num aplicativo como um todo.

Felizmente depois de um tempinho de pesquisas e testes, consegui juntar todas as peças para realização de um projeto desse tipo. Dividirei o processo em etapas, e explicarei cada uma delas.

Etapa 1 – Diálogos de Salvar e Abrir com o CommonDialog

Esta parte não é efetivamente “difícil” de ser realizada, porém, como disse acima, me preocuparei em explicar todas as etapas, para que até os mais inexperientes consigam realizar o processo completo.

Primeiramente, quando pensamos em associar uma extensão ao nosso aplicativo, devemos nos preocupar com os comandos de Salvar e Abrir, que precisam exibir uma caixa de diálogo para que o usuário selecione onde deseja salvar seu arquivo, ou ainda qual arquivo deseja abrir, para depois podermos realizar nossas tarefas de salvar e abrir sabendo o nome do arquivo escolhido. Para isso, existe um componente do VB chamado CommonDialog.

1.1 – Adicionando o CommonDialog ao projeto

Clique com o botão direito do mouse sobre o ToolBox e selecione “Components…”. Na lista de componentes que será mostrada, escolha o “Microsoft Common Dialog Control” (no meu caso é o 6.0, pois utilizo o Service Pack 6 do VB). Certifique-se de que “ticou” o quadradinho, e confirme no “OK”.

Se deu tudo certo, aparecerá o ícone do componente dentro do ToolBox, como mostra a figura abaixo:

1.2 – Configurando o CommonDialog

Adicione um componente CommonDialog ao seu Form, verificando a sua propriedade “name” (o padrão será CommonDialog1).

Para facilitar, criei uma rotina que irá configurar o CommonDialog1 e retornará o nome do arquivo selecionado para nossas funções de salvar e abrir. Neste caso exemplo, iremos configurar uma extensão “.mex”.

Salvar (copie e cole no Form ou num Módulo):


Public Function Dlg_Salvar() As String
Dim Titulo As String
Dim Ext As String
Dim Ext_Descricao As String

'''''''''''''''''''''''''''''''''''''''''''''''
'''Configurando o CommonDialog (altere aqui)'''
'''''''''''''''''''''''''''''''''''''''''''''''

Titulo = "Salvar..." 'Titulo do CommonDialog
Ext = "mex" 'Extensão do seu arquivo
Ext_Descricao = "Arquivo de Minha Extensão" 'Descrição da sua extensão

''''''''''''''''''''''''''''''''''''''''''''''''''''
'''Rotinas do Common Dialog (não precisa alterar)'''
''''''''''''''''''''''''''''''''''''''''''''''''''''

 'indica que, se o usuário cancelar, retornará uma String vazia:
CommonDialog1.CancelError = False
 'limpa o antigo FileName para evitar problemas:
CommonDialog1.FileName = ""
 'mostra o titulo escolhido acima:
CommonDialog1.DialogTitle = Titulo
 'compõe a String de filtro com a extensão escolhida acima:
CommonDialog1.Filter = Ext_Descricao & " (*." & Ext & ") | *." & Ext
 'mostra o CommonDialog de Salvar:
CommonDialog1.ShowSave

Dim Arquivo As String
 'recebe o caminho do arquivo escolhido:
Arquivo = CommonDialog1.FileName

If Len(Arquivo) > 0 Then 'se usuário escolheu um arquivo válido...
    'as quatro linhas abaixo servem para limpar o arquivo, ou seja, se
    'o arquivo selecionado já existir, ele será sobrescrito:
    Dim AuxArq As Integer
    AuxArq = FreeFile
    Open Arquivo For Output As #AuxArq
    Close #AuxArq

    Dlg_Salvar = Arquivo 'RETORNA O CAMINHO DO ARQUIVO
Else 'senão (se o usuário clicou em CANCEL)...
    Dlg_Salvar = "" 'RETORNA STRING VAZIA
End If

End Function

Abrir (copie e cole no Form ou num Módulo):


Public Function Dlg_Abrir() As String
Dim Titulo As String
Dim Ext As String
Dim Ext_Descricao As String

'''''''''''''''''''''''''''''''''''''''''''''''
'''Configurando o CommonDialog (altere aqui)'''
'''''''''''''''''''''''''''''''''''''''''''''''

Titulo = "Abrir..." 'Titulo do CommonDialog
Ext = "mex" 'Extensão do seu arquivo
Ext_Descricao = "Arquivo de Minha Extensão" 'Descrição da sua extensão

''''''''''''''''''''''''''''''''''''''''''''''''''''
'''Rotinas do Common Dialog (não precisa alterar)'''
''''''''''''''''''''''''''''''''''''''''''''''''''''

 'indica que, se o usuário cancelar, retornará uma String vazia:
CommonDialog1.CancelError = False
 'limpa o antigo FileName para evitar problemas:
CommonDialog1.FileName = ""
 'mostra o titulo escolhido acima:
CommonDialog1.DialogTitle = Titulo
 'compõe a String de filtro com a extensão escolhida acima:
CommonDialog1.Filter = Ext_Descricao & " (*." & Ext & ") | *." & Ext
 'mostra o CommonDialog de Abrir:
CommonDialog1.ShowOpen

Dim Arquivo As String
 'recebe o caminho do arquivo escolhido:
Arquivo = CommonDialog1.FileName

If Len(Arquivo) > 0 Then 'se usuário escolheu um arquivo válido...
    Dlg_Abrir = Arquivo 'RETORNA O CAMINHO DO ARQUIVO
Else 'senão (se o usuário clicou em CANCEL)...
    Dlg_Abrir = "" 'RETORNA STRING VAZIA
End If

End Function

Exemplo de uso das função acima:


'''Salvar'''
Dim Arq_Salvar As String
Arq_Salvar = Dlg_Salvar 'a função retorna uma String
If Arq_Salvar = "" Then
    MsgBox "Nenhum arquivo escolhido" 'Cancelou
Else
    MsgBox Arq_Salvar 'OK
    'Pronto! aqui você já pode manipular o arquivo escolhido com
    'as rotinas de Salvar do seu aplicativo, onde o path estará
    'guardado na variável Arq_Salvar
End If

'''Abrir'''
Dim Arq_Abrir As String
Arq_Abrir = Dlg_Abrir 'a função retorna uma String
If Arq_Abrir = "" Then
    MsgBox "Nenhum arquivo escolhido" 'Cancelou
Else
    MsgBox Arq_Abrir 'OK
    'Pronto! aqui você já pode manipular o arquivo escolhido com
    'as rotinas de Abrir do seu aplicativo, onde o path estará
    'guardado na variável Arq_Abrir
End If

Etapa 2 – Abrir Arquivos com Duplo-Clique pelo Explorer

Na etapa acima vimos como abrir nossa extensão de dentro do nosso programa, porém ficaria muito mais funcional se o usuário de nosso programa pudesse abrir nossa extensão com um simples duplo-clique através do Windows Explorer. Aqui começa efetivamente a associação da extensão.

Vamos fazer uma pequena reflexão:

– Para que meu aplicativo abra um arquivo de minha extensão, eu preciso apenas saber o endereço (path) do arquivo. Sabendo isso, basta chamar meus comandos de abrir.

– Se meu aplicativo já estiver aberto, utilizo o CommonDialog e recebo o endereço do arquivo.

Agora você deve estar se perguntando:

– E se meu aplicativo não estiver aberto. Como receberei o endereço do arquivo através de um duplo-clique sobre ele no Explorer ?!

Resposta:

– Associação da extensão, utilizada juntamente à função “Command” do VB6.

2.1 – Associando a Extensão Manualmente

Antes de pensarmos em abrir nossos arquivos com duplo-clique, precisamos associar a extensão ao nosso aplicativo dentro do Windows, para que o Explorer a reconheça. Podemos fazer isso manualmente ou através de um programa de instalação do nosso aplicativo.

Para fazer manualmente, iremos no menu “Iniciar > Configurações > Painel de Controle”, então entraremos no ícone “Opções de Pasta”.

Na aba “Tipos de Arquivo”, clique no botão “Novo”. Em seguida, digite a extensão de seu tipo de arquivo e confirme no “OK”:

Em seguida, sua nova extensão aparecerá na lista. Selecione-a e clique no botão “Avançado”. Na nova janela que abriu, clique no botão “Alterar ícone…” e escolha um ícone de sua preferência (ou clique no botão “Procurar…” e localize seu ícone personalizado):

Agora vem a parte mais importante, a associação propriamente dita. Na área de Ações, clique no botão “Novo…”. Na janela de Nova Ação, digite da seguinte forma:

  • Ação – nome que aparecerá quando clicar com o botão direito do mouse sobre o arquivo (neste caso: Abrir)
  • Aplicativo usado para executar a ação – endereço do nosso executável, seguido de espaço e %1 (neste caso: C:\Teste %1). A flag %1 diz ao Windows para enviar como argumento ao nosso programa o path do arquivo clicado no Explorer.
2.2 – Associando a Extensão com o “Inno Setup”

Logicamente, a associação manual mostrada acima serve apenas para testes na fase de desenvolvimento do programa. Quando formos distribuí-lo, como iremos associar a extensão no PC do nosso cliente? O jeito usual de fazer isso é utilizando o próprio setup de instalação que criaremos para nosso aplicativo. Existem vários programas para criação de setups, porém eu recomendo o “Inno Setup” (http://www.jrsoftware.org/isinfo.php), que é gratuito, fácil de manipular e contém vários recursos e add-ins, muito utilizado atualmente.

Como este é um artigo de VB6, omitirei muitas explicações sobre o Inno Setup (basta ver sua documentação, é bem simples de utilizar), e digitarei apenas seu código de script para gerar associações de extensão. Basta copiar e colar para dentro do seu arquivo de setup (.iss), fazendo as adaptações necessárias:


[Registry]
Root: HKCR; SubKey: .mex; ValueType: string; ValueData: Arquivo MEX; Flags: uninsdeletekey
Root: HKCR; SubKey: Arquivo MEX; ValueType: string; ValueData: Projeto Teste; Flags: uninsdeletekey
Root: HKCR; SubKey: Arquivo MEX \Shell\Open\Command; ValueType: string; ValueData: {app}\Teste.exe %1; Flags: uninsdeletevalue
Root: HKCR; Subkey: Arquivo MEX \DefaultIcon; ValueType: string; ValueData: {app}\MeuIcone.ico,0; Flags: uninsdeletevalue

De maneira análoga, substitua:

  • .mex – sua extensão
  • Arquivo MEX – palavra “Arquivo” seguida de sua extensão
  • Projeto Teste – descrição da sua extensão
  • Teste.exe – seu executável (note a presença do %1 como vemos acima)
  • MeuIcone.ico,0 – o arquivo do ícone da sua extensão seguido de vírgula e o índice do ícone dentro do arquivo .ico (um arquivo de ícone pode conter vários índices).
2.3 – Utilizando o método Command

Agora que já sabemos como associar a extensão no sistema operacional, veremos como receber este comando dentro de nosso software.

Graças à flag %1 colocada nas configurações da associação, fazemos isso com apenas uma linha de comando, utilizando o método Command.

Basta que, no evento Form_Load, recuperemos o argumento passado pelo Windows, que será o endereço do arquivo clicado:


Private Sub Form_Load()

Dim Arq_Abrir As String
Arq_Abrir = Command
'Pronto, nossa variável Arq_Abrir já contém o endereço do arquivo 'clicado. Agora basta chamar nossas rotinas de abrir.

End Sub

Assim finalizo este artigo. No próximo artigo mostrarei como responder a um arraste de arquivo vindo do Explorer para a sua aplicação (OLEDragDrop), que poderíamos implementar para ampliar os recursos de acessibilidade de nosso programa, onde o usuário poderá abrir sua extensão arrastando o arquivo com o mouse para dentro do seu aplicativo. Até lá!