Fórum Executar aplicação DOS externa #254937

18/10/2004

0

Estou desenvolvendo um pequeno aplicativo (um front-end para um programa MS-DOS) e estou com um problema. Esse front-end chama o programa DOS passando um parâmetro para ele (o nome de um arquivo). Quando o arquivo não tem espaços no nome, funciona legal; quando possui, não funciona (o programa ´trunca´ o nome do arquivo no primeiro espaço). O esquisito é que se eu digitar diretamente no prompt do DOS usando um arquivo com espaços no nome, o programa aceita numa boa. Como eu posso fazer para funcionar isso no meu sistema? Já tentei até passar entre aspas o nome do arquivo.


Gandalf.nho

Gandalf.nho

Responder

Posts

18/10/2004

Afarias

Vc está usando q função para chamar o programa em DOS?


T+


Responder

Gostei + 0

18/10/2004

Gandalf.nho

Não tenho o programa aqui, mas era WinExec. (não sei se ShellExecute ou CreateProcess funciona para programas DOS.)


Responder

Gostei + 0

18/10/2004

Ipc$

Tente criar um .bat, nele vc chama o programa:
Prog.exe ¬1 ¬2 ¬3 . . .


Responder

Gostei + 0

18/10/2004

Gandalf.nho

E como eu chamo o arquivo BAT e passo o parâmetro?


Responder

Gostei + 0

18/10/2004

Afarias

WinExec é terrível (legado) ;) ... *acho* q mudar mara CreateProcess resolveria (*talvês* até mesmo ShelExecute já resolva)


T+


Responder

Gostei + 0

18/10/2004

Keitarosan

Eu simplesmente aconselharia você continuar chamando o programa com o WinExec, mas de uma maneira diferente, faça assim: WinExec(´nome_do_programa.exe ´nome do arquivo com espaços.ext´´, sw_shownormal);

Sacou a parada?? o simples uso de aspas no nome do arquivo? :D
nome_do_programa.exe ´nome do arquivo com espaços.ext´

Um conceito simples esse, tudo que está dentro de aspas é considerado como uma ´coisa´ só... nao importa se tem espaço ou qualquer outra tranqueira...

Agora teste e me diga se funciona, se nao funcionar pelo menos eu tentei ajudar :roll: :wink:


Responder

Gostei + 0

18/10/2004

Gandalf.nho

Eu já tentei usar as aspas mas não funcionou, mas obrigada pela boa vontade


Responder

Gostei + 0

18/10/2004

Keitarosan

Em que plataforma você está testando?? Win98, XP?
Você não poderia me enviar o tal executavel de DOS pra eu possa testar aqui?? é coisa rápida, se quiser... :D


Responder

Gostei + 0

18/10/2004

Gandalf.nho

Estou testando no windows 98. E o tal executável de DOS é um simples emulador de MegaDrive (o Genecyst). É que estou no serviço e não tenho o arquivo aqui, mas você pode pegá-lo na Internet e dar uma olhada...


Responder

Gostei + 0

18/10/2004

Vinicius2k

gandalf,

Eu nunca testei este meu processo num caminho com espaços, mas eu uso a CreateProcess... neste exemplo, rodo o gbak...

{ **** Executa um processo **** }
function ExecProcess(FileName, Params: String; WindowState: Word; ProcessName: String = ´´; Wait: Boolean = True): Boolean;
var SI: TStartupInfo;
    PI: TProcessInformation;
    CmdLine: String;
begin
  CmdLine:= FileName + ´ ´ + Params;
  FillChar(SI, SizeOf(SI), #0);
  with SI do
    begin
      cb:= SizeOf(SI);
      dwFillAttribute:= FOREGROUND_RED;
      if ProcessName <> ´´ then lpTitle:= PChar(ProcessName);
      wShowWindow:= WindowState;
      dwFlags:= STARTF_USESHOWWINDOW + STARTF_USEFILLATTRIBUTE;
    end;
  Result:= CreateProcess( nil, PChar(CmdLine), nil, nil, False,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(FileName)), SI, PI
                         );
  if Result then
    begin
      if Wait then
        WaitForSingleObject(PI.hProcess, INFINITE);
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    end;
end;

// ********************************************** \\

procedure Tfrm_backup.btn_executarClick(Sender: TObject);
var gParams: String;
begin
  gParams:= ´-b -v -y ´  + edt_LogFile.Text + ´ ´ +
            ´-user ´     + edt_usuario.Text + ´ ´ +
            ´-password ´ + edt_senha.Text   + ´ ´ +
            edt_DatabaseFile.Text           + ´ ´ +
            edt_BackupFile.Text;
  { **** }
  ExecProcess(edt_gbakPath.Text, gParams, SW_SHOW,´Back-Up´);
  { **** }
end;


Espero ter ajudado...
T+


Responder

Gostei + 0

18/10/2004

Keitarosan

Poxa, muito estranho esse seu emulador aí, acabei de rodar o seguinte aqui:
WinExec(PChar(´c:\windows\command\edit.com /B ´c:\teste com espaços\novo arquivo.txt´ /H´), SW_SHOWNORMAL);

olha que eu fiz questao de colocar espaços e chars especiais(ç) no parametro que corresponde ao nome do arquivo, mas ele abriu normalmente, obedeceu os parametros /H e /B tbm...

Agora, vou pegar esse emulador aí que você falou, pq isso tá parecedendo uma particularidade dele e não do WinEXEC...


Responder

Gostei + 0

18/10/2004

Keitarosan

Viu? como eu disse, era apenas uma particularidade do emulador :P
Ele não aceita espaços no meio do nome do arquivo, pode trocar de WinExec pra outra rotina, pode trocar de linguagem, pode até esperniar, o bichinho é teimoso :x :lol:

Olha só como você pode resolver:
var
  pathEmu, pathRom: string;
begin
  pathEmu := ExtractShortPathName(´c:\emulador de mega drive\genecyst.exe´);
  pathRom := ExtractShortPathName(´c:\emulador de mega drive\roms do emulador\booger man.smd´);
  WinExec(PChar(Format(´¬s ¬s´, [pathEmu, pathRom])), SW_SHOWNORMAL);


é claro que esses caminhos que eu utilizei sao do meu computador aqui, mas funfou que foi uma beleza :wink:

Eu nao sei como você conseguiu abrir o arquivo manualmente nao, mas eu nao consegui aqui, mesmo digitando o nome do arquivo, o emulador nao aceitava o espaço...

Ele só aceita o filenames no formato 8.3 do velho DOS... =P


Bom, espero que a senhorita resolva seu problema agora :wink:


Responder

Gostei + 0

19/10/2004

Ipc$

Tente criar um .bat, nele vc chama o programa: Prog.exe ¬1 ¬2 ¬3 . . .

E como eu chamo o arquivo BAT e passo o parâmetro?

WinExec(´C:\Temp\x.bat Nome do Arquivo´, sw_Show);
No x.bat vc coloca:
Prog.exe ¬1 ¬2 ¬3


Responder

Gostei + 0

19/10/2004

Gandalf.nho

Valeu pela ajuda pessoal, vou testar em casa assim que me sobrar um tempinho :D


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar