Ir para conteúdo
Fórum Script Brasil
  • 0

Win Exec, Com .ini


Yugi Moto

Pergunta

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 @MY_ASS@ _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 !!!

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 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 @MY_ASS@ _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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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 @MY_ASS@ _server%s', [Ini.readstring('site', 'patch', 'about:Erro')]);
  WinExec(Pchar(CommandLine), sw_ShowNormal);
  finally

end;
end;

Link para o comentário
Compartilhar em outros 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 @MY_ASS@ _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?

Link para o comentário
Compartilhar em outros 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).

Link para o comentário
Compartilhar em outros sites

  • 0

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

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

por

CommandLine := Format('demo.exe @MY_ASS@ _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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...