Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.007 c
1-24832
smok_er
2002-12-27 10:53
2003.01.09
Типизированный файл - замена БД


8-24980
IgorZu
2002-09-19 14:48
2003.01.09
Работа с MP3


3-24818
XM-AD
2002-12-17 10:17
2003.01.09
Снова кодировки! Что не правильно?


7-25109
AndrewK
2002-10-28 16:40
2003.01.09
Как отследить коннект?


1-24975
Rus
2002-12-27 10:10
2003.01.09
Quick Report





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский