Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Командная строка, RAR для DOS 
:(
    Опции темы
MacTep
Дата 3.2.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Как выполнить распаковку архива из Дельфи простым доисторическим раром? Или упаковку. Например, строка командная такая: rar a -m5 my.rar *.cfg. Как это выполнить из Дельфи?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Savek
Дата 3.2.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: нет
Всего: 7



Например так
Код

WinExec(PAnsiChar('rar a -m5 my.rar *.cfg'),SW_RESTORE)

PM MAIL   Вверх
MacTep
Дата 3.2.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



А вот не работает так. Я попробовал. И не знаю почему. Такая же штука в командной строке в винде работает. А вот так, из Дельфи, ни фига... smile


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
smartov
Дата 3.2.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



MacTep, а не забыл в рабочую папку переместиться перед командой?
PM MAIL   Вверх
RideX
Дата 3.2.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 2
Всего: 7



Цитата(MacTep @  3.2.2007,  18:18 Найти цитируемый пост)
А вот не работает так. Я попробовал.

Не знаю как сказать.. люди до сих пор используют WinExec в своих проектах.  smile 
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  si: _STARTUPINFOA;
  pi: _PROCESS_INFORMATION;
begin
  ZeroMemory(@si, SizeOf(si));
  si.cb := SizeOf(si);
  ZeroMemory(@pi, SizeOf(pi));
  if CreateProcess(nil,'RAR205.EXE a -m5 MY.RAR *.cfg',
                   nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil, nil, si, pi) then begin
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  end;
end;

PM   Вверх
VICTAR
Дата 3.2.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: нет
Всего: 80



Легче всего ShellExecute, там тебе и параметры отдельно и директория...
PM MAIL   Вверх
RideX
Дата 3.2.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 2
Всего: 7



Цитата(VICTAR @  4.2.2007,  00:52 Найти цитируемый пост)
Легче всего ShellExecute

Через ShellExecute невозожно отследить завершение работы дочернего процесса, а процесс архивирования/распаковки может занимать достаточно продолжительное время.
PM   Вверх
VICTAR
Дата 4.2.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: нет
Всего: 80



2RideX, согласен. Но автору это вроде этого и не требовалось. Хотя как знать...
PM MAIL   Вверх
MacTep
Дата 4.2.2007, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Я фигею. Вот не работает и все тут...
Вот мой код:
Код

procedure TfrmMain.Button1Click(Sender: TObject);
var si:_STARTUPINFOA;
    pi:_PROCESS_INFORMATION;
begin
  ZeroMemory(@si,SizeOf(si));
  si.cb:=SizeOf(si);
  ZeroMemory(@pi,SizeOf(pi));
  if CreateProcess(nil,PAnsiChar(ExtractFilePath(Application.Exename) + 'RAR.EXE a MY.RAR *.pas'),
                   nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil, nil, si, pi) then
    begin
      WaitForSingleObject(pi.hProcess,INFINITE);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
    end;
end;
И директория та, и ключи командной строки. А не работает ни фига. Хотя в винде все работает нормально. Что поделать?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MacTep
Дата 4.2.2007, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



smile Сделал... Пипец... Еле отловил... Оказалось... Будете смеяться, что строчку ExtractFilePath(Application.Exename) надо было подставить перед каждым параметром командной строки...
Код

procedure TfrmMain.Button1Click(Sender: TObject);
var si:_STARTUPINFOA;
    pi:_PROCESS_INFORMATION;
    str:String;
begin
  ZeroMemory(@si,SizeOf(si));
  si.cb:=SizeOf(si);
  ZeroMemory(@pi,SizeOf(pi));
  str:=ExtractFilePath(Application.Exename);
  if CreateProcess(nil,PAnsiChar(str+'RAR.EXE a '+str+'MY.RAR '+str+'*.pas'),
                   nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil, nil, si, pi) then
    begin
      WaitForSingleObject(pi.hProcess,INFINITE);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
    end;
end;
Спасибо всем за обсуждение... smile


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
dumb
Дата 4.2.2007, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



достаточно указать текущую папку(а заодно можешь изучить, что это такое) в соответствующем параметре.
Код

  if CreateProcess(nil,PAnsiChar('RAR.EXE a MY.RAR *.pas'),
                   nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil, PAnsiChar(ExtractFileDir(Application.Exename)), si, pi) then

PM MAIL   Вверх
MacTep
Дата 4.2.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Оооо, благодарю... А скрыть окно rar можно? Чтобы оно не мигало?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
VICTAR
Дата 4.2.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: нет
Всего: 80



Можно так
Код

si.dwFlags := STARTF_USESHOWWINDOW;


Добавлено @ 12:32 
упс... забыл
Код

si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow:= SW_HIDE ;

PM MAIL   Вверх
MacTep
Дата 9.2.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Вот такой код:
Код

procedure unpack(filename:string);
var si:_STARTUPINFOA;
    pi:_PROCESS_INFORMATION;
    str,s:String;
begin
  ZeroMemory(@si,SizeOf(si));
  si.cb:=SizeOf(si);
  ZeroMemory(@pi,SizeOf(pi));
  str:=ExtractFileDir(Application.Exename);
  s:=str+'\rar.exe e -o+ '+str+'\data\temp\'+filename+'.rar '+str+'\data\temp\';
  if CreateProcess(nil,PChar(s),
                   nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil, nil, si, pi) then
    begin
      WaitForSingleObject(pi.hProcess,INFINITE);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
    end;
end;
Работает всегда, если в имени папок нет пробелов и русских символов. Как только они появляются, особенно пробелы - все, беда. Файл не распаковывается. Что сделать, чтобы работало даже тогда, когда есть русские символы и пробелы? Подскажите, пожалуйста.


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
smartov
Дата 9.2.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



Цитата(MacTep @  9.2.2007,  07:48 Найти цитируемый пост)
Что сделать, чтобы работало даже тогда, когда есть русские символы и пробелы?

Использовать Unicode-версию функции CreateProcess (скорее всего CreateProcessW). Она вместо PCHar попросит PWideChar
PM MAIL   Вверх
MetalFan
Дата 9.2.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(RideX @  3.2.2007,  23:16 Найти цитируемый пост)
Через ShellExecute невозожно отследить завершение работы дочернего процесса,

зато можно через ShellExecuteEx... и не надо десяток параметров, всего одна запись ;)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MacTep
Дата 9.2.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Цитата(smartov @  9.2.2007,  09:41 Найти цитируемый пост)
Использовать Unicode-версию функции CreateProcess (скорее всего CreateProcessW). Она вместо PCHar попросит PWideChar 
Где же такую функцию взять? В хелпе о такой ни слова не нашел...



--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MacTep
Дата 9.2.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Цитата(MetalFan @  9.2.2007,  10:05 Найти цитируемый пост)
зато можно через ShellExecuteEx... и не надо десяток параметров, всего одна запись ;) 

Да еще бы взять пример, как выполнять процесс при помощи данной команды... А то у меня, например на строчке ShellExecuteEx('rar.exe'); вылезает ошибка Incompatible types: 'String' and 'PShellExecuteInfoA'. Можно пример использования данной функции???


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MetalFan
Дата 9.2.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



MacTep, а F1 уже отменили? туда параметром идет запись.
так и быть) вот пример:
Код

var
  lSEI: TShellExecuteInfoA;
  lFile: string;
...
begin
  lFile := 'notepad.exe';
  ZeroMemory( @lSEI, SizeOf(TShellExecuteInfoA) );
  lSEI.cbSize := SizeOf(TShellExecuteInfoA);
  lSEI.lpFile := PChar(lFile);
  lSEI.Wnd := Application.Handle;
  lSEI.nShow := SW_SHOWNORMAL;



  if ShellExecuteEx( @lSEI ) then
    ShowMessage('Started')
  else
    ShowMessage( 'Error:'+SysErrorMessage(GetLastError));
...



Это сообщение отредактировал(а) MetalFan - 9.2.2007, 14:45


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MacTep
Дата 9.2.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Попробовал. Не работает. Не находит мой файл... Хотя файл лежит на месте. Странно...
Вот код:
Код

procedure unpack(filename:string);
varlSEI: TShellExecuteInfoA;
    lFile: string;
    str,s:String;
begin
  str:=ExtractFileDir(Application.Exename);
  s:=str+'\rar.exe e -o+ '+str+'\data\temp\'+filename+'.rar '+str+'\data\temp\';
  ZeroMemory( @lSEI, SizeOf(TShellExecuteInfoA) );
  lSEI.cbSize := SizeOf(TShellExecuteInfoA);
  lSEI.lpFile := PChar(s);
  lSEI.Wnd := Application.Handle;
  lSEI.nShow := SW_SHOWNORMAL;
  ShellExecuteEx(@lSEI);
end;


Добавлено @ 19:04 
Цитата(smartov @  9.2.2007,  09:41 Найти цитируемый пост)
Использовать Unicode-версию функции CreateProcess (скорее всего CreateProcessW). Она вместо PCHar попросит PWideChar 
Не нашел такой функции. И даже на нее похожей не нашел.

Это сообщение отредактировал(а) MacTep - 9.2.2007, 18:58


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MacTep
Дата 9.2.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Нда, странный вопрос. И поперлись мы все не в те дебри. Поискал по хелпу, что можно делать со строками. И нашел замечательную функцию - ExtractShortPathName - гениально до безумия. smile Представляет имена файлов в формате 8.3 - то есть, досовский формат. И так работает и с русскими символами, и с пробелами. А вообще. Гуд! 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Данкинг
Дата 10.3.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



А вот у меня такая проблема: нужно выполнить ДОСовскую команду сборки файлов (aaa1+aaa2=aaa3):

Код


ff:='copy aaa1.txt +aaa2.txt aaa3.txtf';

ZeroMemory(@si, SizeOf(si));
  si.cb := SizeOf(si);
  ZeroMemory(@pi, SizeOf(pi));
  if CreateProcess(nil,PChar(ff),
                   nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil, nil, si, pi) then begin
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  end;

Ошибок никаких не возникает, но команда почему-то не выполняется, т.е., файлы не объединяются. Почему такое может быть?.. Чувствую, придётся вручную собирать файлы...

Это сообщение отредактировал(а) Данкинг - 10.3.2007, 19:32


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
smartov
Дата 11.3.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



Данкинг, попробуй указать полные пути к файлам...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.