• 0
Sign in to follow this  
Yugi Moto

Win Exec, Com .ini

Question

bem, estou executando um programa com paramentos, usando o "winexec".

mas como ele carrega paramentos, inclusive endereço de "IP", eu estou usando um arquivo .INI para pegar o IP.

mas ele não funciona.

vejam o código:

procedure TForm1.ImageButton1Click(Sender: TObject);
var
  Name : PChar;
  TempName : PChar;
  Ini: tinifile;
begin
  try
    Ini  := TiniFile.create('config/config.ini');
    Name := 'Dummy Text';
    TempName := PChar(Name);
    GetWindowText(Handle, TempName, Length(Name));
    Name := PChar(TempName);
    WinExec(PChar('demo.exe @[email protected] _server' +
      Ini.readstring('site', 'patch', 'about:Erro')), sw_ShowNormal);
  finally
    Ini.Free;

  end;
  end;
bem, o .INI também está certo, mas vou postar aqui também.
[site]

server = google.com
reg = irose.iwamotoweb.com
img = skin/yugi.jpg
patch = 127.0.0.1

bem já estou a um bom tempo quebrando a cabeça com este código, ai se alguém puder ajudar !!!

Share this post


Link to post
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Yugi Moto, sobre o uso de try..finally..end: você só pode usar o finally para liberar a classe com segurança se você antes alocou uma instância para ela. Imagine que se colocando o create da classe dentro do try e ocorrer um erro justamente neste método, não haverá uma instância alocada para o mesmo e, portando, você estará sugeito a erros ao tentar liberá-la no finally. A regra é: aloque uma instância para a classe e, daí sim, se ocorrer algum erro ou não, ao acessar ele, você libera ao final

  Ini  := TiniFile.create('config/config.ini');
  try
   // faz alguma coisa com o arquivo ini
  finally
    Ini.Free;
  end;
O que é que você pretende com isto?
    Name := 'Dummy Text';
    TempName := PChar(Name);
    GetWindowText(Handle, TempName, Length(Name));
    Name := PChar(TempName);
Quanto a parte do WinExec, sugiro que você faça da seguinte forma:
var
  CommandLine :string;
  ...
begin
  ...
  CommandLine := Format('demo.exe @[email protected] _server%s', [Ini.readstring('site', 'patch', 'about:Erro')]);
  WinExec(PChar(CommandLine), sw_ShowNormal);
  ...
end;

usando a função format, você substituirá o %s (variável string) pelo valor passado no array. Assim, você poderá colocar um break-point na montagem do texto CommandLine e executando passo-a-passo (F8), visualizar seu conteúdo (CTLR+F7) sobre o nome da variável.

Abraços

Share this post


Link to post
Share on other sites
  • 0
Guest Visitante

@Micheus

sim, concordo com você, mas é que neste modo, o programa não é executado,

ele não retorna nenhum erro, mas não funciona nada !!!

eu sei que no modo que eu estava fazendo não é o correto, mas o programa era executado, mas não carregava os paramentos do arquivo .INI

Share this post


Link to post
Share on other sites
  • 0

@Micheus

sim, concordo com você, mas é que neste modo, o programa não é executado,

ele não retorna nenhum erro, mas não funciona nada !!!

eu sei que no modo que eu estava fazendo não é o correto, mas o programa era executado, mas não carregava os paramentos do arquivo .INI

Share this post


Link to post
Share on other sites
  • 0

@Micheus

deixei o código como você indicou, mas acontece os mesmos erros, ele executa o programa, mas não carrega o IP, ou seja não roda corretamente...

procedure TForm1.ImageButton1Click(Sender: TObject);
var
  Ini: tinifile;
  CommandLine :string;
begin
  try
  Ini  := TiniFile.create('config.ini');
  CommandLine := Format('demo.exe @[email protected] _server%s', [Ini.readstring('site', 'patch', 'about:Erro')]);
  WinExec(Pchar(CommandLine), sw_ShowNormal);
  finally

end;
end;

Share this post


Link to post
Share on other sites
  • 0

Yugi Moto, primeiramente, corrija o código pois você esqueceu do Ini.Free e colocou o create do Ini dentro do try - deve ser antes. Fica assim

procedure TForm1.ImageButton1Click(Sender: TObject);
var
  Ini: tinifile;
  CommandLine :string;
begin
  Ini  := TiniFile.create('config.ini');
  try
    CommandLine := Format('demo.exe @[email protected] _server%s', [Ini.readstring('site', 'patch', 'about:Erro')]);
    WinExec(Pchar(CommandLine), sw_ShowNormal);
  finally
    Ini.Free;
  end;
end;

deixei o código como você indicou, mas acontece os mesmos erros, ele executa o programa, mas não carrega o IP, ou seja não roda corretamente...
me explique o seguinte:

1) você debugou o programa como lhe sugeri para que você consiga visualizar o conteúdo da string CommandLine e avaliar se realmente ela não está carregando os dados do arquivo ini?

2) O program demo.exe é um programa seu ou de terceiro?

3) quantos e quais os parâmetros esperados pelo programa demo?

Share this post


Link to post
Share on other sites
  • 0

1)Sim eu criei as break-point, como você pode ver na foto abaixo:

263361_erro_delphi.jpg

Apesar de não entender muito do breakpoint, acho que não aparenta erros certo ??

2) o programa Demo.exe é de terceiro.

3) no atalho do programa ele tem o seguinte:

demo.exe @[email protected] _server 127.0.0.1 

Share this post


Link to post
Share on other sites
  • 0
1)Sim eu criei as break-point, como você pode ver na foto abaixo:

263361_erro_delphi.jpg

Apesar de não entender muito do breakpoint, acho que não aparenta erros certo ??

o break-point por si só não diz nada. Na figura, observe que o break que você marcou na declaração de CommandLine é inválido. Só podem haver válidos aonde você observar que tem aquelas "bolinhas azuis". beleza?!

O que vai realmente lhe ajudar em alguma coisa, é aquele break na linha: WinExec(....).

Quando você está executando o programa e ao clicar o botão Button1, ao parar a execução do programa nela, você pode avaliar o conteúdo da sua string CommandLine. Para isto você pode simplesmente posicionar o cursor sobre o nome da mesma (na linha anterior) e teclar CTRL+F7. Vai aparecer uma janela de avaliação (Evaluate/Modify) aonde você poderá observar como ficou o texto formatado. Daí você vai ter certeza de que está realmente havendo ou não um problema com a leitura do arquivo ini - se não houver sua linha de comando estará correta e o problema pode ser outro.

Para continuar a execução, após a parada no break, você pode utilizar F8 (continha execução linha-a-linha, na verdade quase isso) ou F9 para executar o programa sem paradas (exceto se passar novamente por algum break).

Share this post


Link to post
Share on other sites
  • 0

Ok, Micheus ele está carregando o arquivo .INI, e a linha para o arquivo, veja na foto:

264294_erro_delphi02.jpg

porem, ele não está dando o "ESPAÇO" e acredito que seja isso o problema !!!

tentei colocar o espaço no arquivo .INI, mas não adiantou, ele fica na mesma.

Share this post


Link to post
Share on other sites
  • 0

Yugi Moto, neste caso, a falha está no meu exemplo. Troque:

CommandLine := Format('demo.exe @[email protected] _server%s', [ini.readstring('site', 'patch', 'about:Erro')]);

por

CommandLine := Format('demo.exe @[email protected] _server %s', [ini.readstring('site', 'patch', 'about:Erro')]);

Ou seja, acrescente o espaço antes do %s (%s é o lugar onde a string lida será inserida). Caso, corrigido isto, ainda não haver a execução esperada, então o problema reside noutro ponto.

Bom, agora você também já sabe utilizar melhor o break-point e evaluate/modify, isto lhe ajudará bastante no processo de "debugar" suas aplicações.

Abraços

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this