Форум: "WinAPI";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Внизcmd.exe Найти похожие ветки
← →
chernoruk (2002-11-15 20:02) [0]Скажите, как из своего приложения взаимодействовать с коммандной строкой? да так, чтоб всё это не было видно извне -т.е. что не появлялось черное окно
← →
Eugen Honeker (2002-11-15 20:20) [1]повесь на форму
1. memo
2. edit
3. button
и задай в edit комманду
//Featured by NiCoDe - all credits go to him!!!
function CreatePipedProcess(lpCommandLine: PChar): string;
var
lpPipeAttributes: TSecurityAttributes;
hReadPipe: THandle;
hWritePipe: THandle;
lpStartupInfo: TStartupInfo;
lpProcessInformation: TProcessInformation;
lpNumberOfBytesRead: DWORD;
Buffer: array [0..1023] of Char;
begin
Result := "";
ZeroMemory(@lpPipeAttributes, SizeOf(TSecurityAttributes));
lpPipeAttributes.nLength := SizeOf(TSecurityAttributes);
lpPipeAttributes.bInheritHandle := True;
if CreatePipe(hReadPipe, hWritePipe, @lpPipeAttributes, 0) then
begin
ZeroMemory(@lpStartupInfo, SizeOf(TStartupInfo));
lpStartupInfo.cb := SizeOf(TStartupInfo);
lpStartupInfo.dwFlags := STARTF_USESTDHANDLES;
lpStartupInfo.hStdOutput := hWritePipe;
lpStartupInfo.hStdError := hWritePipe;
lpStartupInfo.dwFlags := lpStartupInfo.dwFlags or STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_HIDE;//SW_MINIMIZE;
if CreateProcess(nil, lpCommandLine, nil, nil, True, CREATE_NEW_CONSOLE,
nil, nil, lpStartupInfo, lpProcessInformation) then
try
CloseHandle(hWritePipe);
Buffer[0] := #0;
repeat
Result := Result + Buffer;
ZeroMemory(@Buffer, SizeOf(Buffer));
lpNumberOfBytesRead := 0;
until not ReadFile(hReadPipe, Buffer, SizeOf(Buffer) - 1, lpNumberOfBytesRead, nil);
finally
CloseHandle(hReadPipe);
CloseHandle(lpProcessInformation.hThread);
CloseHandle(lpProcessInformation.hProcess);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
lpCommandLine: array [0..2 * MAX_PATH] of Char;
begin
ZeroMemory(@lpCommandLine, SizeOf(lpCommandLine));
if ExpandEnvironmentStrings("%ComSpec% /C ", lpCommandLine,
SizeOf(lpCommandLine) - 1) > 0 then
begin
lstrcat(lpCommandLine, PChar(Edit1.Text));
Memo1.Text := CreatePipedProcess(lpCommandLine);
end else
MessageBox(0, "command interpeter not found!", nil, 0);
end;
← →
chernoruk (2002-11-15 20:44) [2]спасибо, сейчас попробую...
← →
chernoruk (2002-11-15 22:38) [3]что-то она возвращает резултат не полностью-щас разберусь, почему...
← →
bak (2002-11-16 11:28) [4]>chernoruk
я попробовал так
if ExpandEnvironmentStrings("%ComSpec% /K ", lpCommandLine,
SizeOf(lpCommandLine) - 1) > 0 then
пишет больше, но все равно глючит.
не понимает русских букв, и не знаю, как выйти по cd выше, чем на 1 папку
← →
Eugen Honeker (2002-11-16 12:07) [5]дареному коню в зубы не смотрят :)
дорогие, етот примерчик вам на растерзание,
мне лень разбиратся.
← →
Eugen Honeker (2002-11-16 12:13) [6]дополнение:
русские буквы: можно с OemToCharBuffer попробовать
repeat
...
until not ReadFile(hReadPipe, Buffer, SizeOf(Buffer) - 1, lpNumberOfBytesRead, nil
здесь надо или buffer увеличить или считаемое сохранить
← →
bak (2002-11-16 13:39) [7]>Eugen Honeker
с OemToCharBuffer ты прав - все пошло :)
а насчет папок - я понял в чем здесь прикол
в примере каждый раз по новому с помощью крейтпроцесс запускается новый процессор. естественно, что он не запоминает текущий каталог. наверное можно его запоминать по последней строке, которую выдает предыдущий процессор (или еще как)
← →
chernoruk (2002-11-16 23:14) [8]странно:
CreateProcess(lpCommandLine,nil, nil, nil, True, CREATE_NEW_CONSOLE,
nil, nil, lpStartupInfo, lpProcessInformation)
(lpCommandLine=%ComSpec%)
уже выдает ошбку...
и вообще: как команду передавать не при запуске, а через WriteFile? что-то я с параметрами запутался
← →
Eugen Honeker (2002-11-17 16:01) [9]какую ошибку?
что GetLastError на ету тему говорит?
в принципе можно вообще без %ComSpec%, сразу
передать комманду (например: "cmd.exe /C dir c:\");
← →
chernoruk (2002-11-18 17:43) [10]вот, пожалуйста:
CreateProcess(lpCommandLine,nil, nil, nil, True, CREATE_NEW_CONSOLE,
nil, nil, lpStartupInfo, lpProcessInformation)
(lpCommandLine=%ComSpec%)
GetLastError= No access (998)
← →
Eugen Honeker (2002-11-18 17:57) [11]что значит
lpCommandLine=%ComSpec%
?
ты не переводишь lpCommandLine с помощью
ExpandEnvironmentStrings("%ComSpec%",...
?
← →
chernoruk (2002-11-18 19:13) [12]а что значит ключ /C (/K)
← →
Anatoly Podgoretsky (2002-11-18 19:18) [13]А самому получить справку ну никак?
← →
chernoruk (2002-11-18 23:50) [14]что-то я такого в msdn не нашел...
может, ссылка акакя полезная есть?
было бы здорово
← →
Eugen Honeker (2002-11-19 02:46) [15]да задай просто в cmd-box"е "cmd /?".
увидешь все пояснения. ёлки палки...
← →
chernoruk (2002-11-19 14:37) [16]усёк, всё просто, спасибо
← →
chernoruk (2002-11-19 21:11) [17]единственный глюк: ну никак не могу послать ничего в pipe с помощью WriteFile. Как надо оформить вызов этой функции?
← →
bak (2002-11-20 09:57) [18]и еще один мааленький вопросик: при вызове какого либо процесса, который автоматически не закрывается (например блокнота) из этой проги, она намертво останавливается на цикле
repeat
Result := Result + Buffer;
ZeroMemory(@Buffer, SizeOf(Buffer));
lpNumberOfBytesRead := 0;
until not ReadFile(hReadPipe, Buffer, SizeOf(Buffer) - 1, lpNumberOfBytesRead, nil);
а точнее на ReadFile. Как это можно побороть?
← →
bak (2002-11-20 16:16) [19]Ппомогите плз, тема ведь еще не закрыта...
← →
chernoruk (2002-11-20 18:38) [20]вот последний вопрос:
с пайпом я разобрался, но как сделать так чтоб не закрывать пайп на STDIN каждый раз после посылки команды?
т.е. есть 2 пайпа- на stdin и stdout
с помощью DuplicateHandle(...false...)
и далее по msdn(там есть пример)
но если не закрывать пайп на stdin, то ничего не получается..
Может, кто сталкивался и знает?(
← →
chernoruk (2002-11-21 21:05) [21]ну не может быть что никто не знает как читать из пайпа на который есть открытый ххэндл на запись???????
весь измучился уже: в примере msdn этот хэндл закрывают, т. е. нельзя потом ещй раз послать команду для cmd line
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c