Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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