Executar aplicação DOS externa
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
Curtidas 0
Respostas
Afarias
18/10/2004
Vc está usando q função para chamar o programa em DOS?
T+
T+
GOSTEI 0
Gandalf.nho
18/10/2004
Não tenho o programa aqui, mas era WinExec. (não sei se ShellExecute ou CreateProcess funciona para programas DOS.)
GOSTEI 0
Ipc$
18/10/2004
Tente criar um .bat, nele vc chama o programa:
Prog.exe ¬1 ¬2 ¬3 . . .
Prog.exe ¬1 ¬2 ¬3 . . .
GOSTEI 0
Gandalf.nho
18/10/2004
E como eu chamo o arquivo BAT e passo o parâmetro?
GOSTEI 0
Afarias
18/10/2004
WinExec é terrível (legado) ;) ... *acho* q mudar mara CreateProcess resolveria (*talvês* até mesmo ShelExecute já resolva)
T+
T+
GOSTEI 0
Keitarosan
18/10/2004
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:
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:
GOSTEI 0
Gandalf.nho
18/10/2004
Eu já tentei usar as aspas mas não funcionou, mas obrigada pela boa vontade
GOSTEI 0
Keitarosan
18/10/2004
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
Você não poderia me enviar o tal executavel de DOS pra eu possa testar aqui?? é coisa rápida, se quiser... :D
GOSTEI 0
Gandalf.nho
18/10/2004
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...
GOSTEI 0
Vinicius2k
18/10/2004
gandalf,
Eu nunca testei este meu processo num caminho com espaços, mas eu uso a CreateProcess... neste exemplo, rodo o gbak...
Espero ter ajudado...
T+
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+
GOSTEI 0
Keitarosan
18/10/2004
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...
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...
GOSTEI 0
Keitarosan
18/10/2004
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:
é 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:
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:
GOSTEI 0
Ipc$
18/10/2004
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
GOSTEI 0
Gandalf.nho
18/10/2004
Valeu pela ajuda pessoal, vou testar em casa assim que me sobrar um tempinho :D
GOSTEI 0