segunda-feira, 29 de agosto de 2011

wxWidgets – Pegando o diretório da aplicação em wxWidgets


Um erro comum em wxWidgets é usar wxGetCwd() para pegar o diretório da aplicação, este comando retorna o diretório de trabalho atual, em alguns casos, onde nenhum arquivo fora do diretório da aplicação é acessado, este comando pode até funcionar, mas quando saímos do diretório da aplicação este comando retorna um valor diferente do esperado.

Vejam por exemplo o que este comando retorna quando eu tento abrir um arquivo que está no meu Desktop diretamente em um sistema que está em /home/alex/Documentos/gerbsox/bin/Debug

E se eu tentar executar o mesmo pelo Code::Blocks o resultado será o seguinte:


Para contornar esta situação eu uso uma função bem simples que segue a baixo:


//Primeiro adiciono o arquivo de cabeçalho que contém wxStandardPaths
#include <wx/stdpaths.h>

//Aqui implemento um função chamada GetExecPath() que me retornará uma wxString...

wxString GetExecPath()
{
    //Esta função wxStandardPaths::Get().GetExecutablePath()
    //me retorna um caminho completo para o executável
    //incluindo o nome do executável, o que não é o que nós queremos...
    wxString path_c = wxStandardPaths::Get().GetExecutablePath();

    //Resolvemos o problema usando wxPathOnly(...)
    //que vai retornar apenas o valor do diretório removendo o nome do arquivo...
    wxString path_ok = wxPathOnly(path_c);

    //Agora é só eu retornar o valor correto do diretório da aplicação...
   return path_ok;

    //poderíamos economizar código escrevendo a função inteira assim:
    //return wxPathOnly(wxStandardPaths::Get().GetExecutablePath());
}


Vejam que se eu não usar o wxPathOnly(...), o nome do executável também aparecerá na string
Onde /home/alex/Documentos/gerbsox/bin/Debug é o diretório da minha aplicação e gerbsox é o meu executável...

Vamos repetir o que foi feito anteriormente para ver o que o comando vai nos retornar.

Aqui executando o aplicativo pelo CodeBlocks...


...e aqui abrindo o arquivo que estava na área de trabalho...


Espero ter ajudado em alguma coisa.

Até a próxima...

0 comentários:

Postar um comentário