DICAS

Visite a biblioteca de dicas da comunidade.

Saiba mais

ARTIGOS

Abordagens detalhadas sobre assuntos diversos.

Saiba mais

INICIANTES

Aprenda a programar de um modo simples e fácil.

Saiba mais

DOWNLOADS

Acesse os materiais exclusivos aos membros.

Saiba mais
voltar

PARA QUEM GOSTA DE DELPHI

Como obter o path do meu executável ou DLL?

Quando estamos criando nossos sistemas, muitas vezes precisamos efetuar a leitura de algum arquivo de configuração, carregar alguma imagem, localizar o banco de dados, enfim várias tarefas que envolvem localizar algum arquivo.

Normalmente optamos por colocar estes arquivos na pasta do nosso sistema, a fim de manter uma organização.

Só que o local onde o nosso sistema está pode várias de computador para computador, por exemplo, em uma máquina ele pode estar na unidade C, em outra pode estar na D, também pode estar dentro de alguma pasta específica, ou seja infinitas possibilidades.

E então, como poderemos encontrar estes arquivos?

Existe uma solução! No Delphi há uma variável globasl que contém o caminho que o executável está no momento e o mesmo é válido para DLLs.

A variável é a: gsAppPath

Até o Delphi 2010 é necessário declarar SWSystem para localiza-lá;

Já a partir do Delphi XE ou superior declare IWSystem.

Muito bem! E como podemos utiliza-la?

Isso é muito simples mesmo. Vamos ao código.

Exemplo de uso da variável gsAppPath:

1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(gsAppPath);
end;

Realmente é simples assim! A própria variável já vai conter o caminho, seja do executável ou uma DLL.

OBS.

Pessoal, recentemente percebi que no Delphi 10.3 Rio, na compilação para Windows 32 bits, o ocorria erro de IWSystem.dcu not found. Então procurei pelo arquivo na instalação do Delphi e realmente não encontrei para Windows 32 bits. O interessante que para Windows 64 bits o arquivo está lá e compilamos normalmente.

Alguém de vocês está com o mesmo problema?

Também podemos citar algumas alternativas ao uso do gsAppPath, Vamos a elas:

Utilizando o ExtractFilePath da unit Forms:

1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ExtractFilePath (Application.ExeName));
end;

A forma acima funciona para o executável, porém para DLLs vai retornar o caminho do exe princiapal.

Vamos a segunda alternativa, utilizando o ParamStr(0).

É possível utilizar parâmetros para chamar os executáveis. Estes parâmetros podem ser úteis para personalizar diversas tarefas.

O mais interessante é que todos já possuem um parametro de id zero que retorna o caminho que ele está.
E adivinhe, este sim também é compatível com DLLs.

Mas existe outras alternativas, vamos a outro código.

1
2
3
4
5
6
7
8
function GetModuleName: string;
var
  szFileName: array[0..MAX_PATH] of Char;
begin
  FillChar(szFileName, SizeOf(szFileName), #0);
  GetModuleFileName(hInstance, szFileName, MAX_PATH);
  Result := szFileName;
end;

Bem agora é necessário testar.

Vamos ao código!

1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ParamStr(0));
end;

Agora para facilitar o entendimento colocamos as três opções no mesmo exemplo. Vamos ao código da unit completa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms, //<-- Necessário para utilizar o ExtractFilePath
  Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  IWSystem; //<-- Necessário para utilizar gsAppPath,
  // porém lembre-se do problema com o Delphi 10.3 Rio
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(gsAppPath);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(ExtractFilePath (Application.ExeName));
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  { Não requer adicionar units }
  ShowMessage(ParamStr(0));
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  { Não requer adicionar units }
  ShowMessage( GetModuleName );
end;
 
end.

Lembrem-se que dúvidas ou sugestões, utilizem os comentários.

Um abraço e até a próxima pessoal. Valeu!

Facebook Comments Box
  • InfusTec
  • 15.529 views
  • 0 comentários
  • 15 de abril de 2015

Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!

Deixe um comentário

Ir ao topo

© 2024 Infus Soluções em Tecnologia - Todos os Direitos Reservados