Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2012, 20:03   #1
Ёжик в тумане
Подтвердите свой е-майл
 
Регистрация: 20.07.2011
Сообщений: 239
По умолчанию Разработка оболочки для UPX для своих нужд

Здравствуйте! В общем хочу автоматизировать работу упаковщика UPX.
То есть - сделать оболочку на подобии UPX Shell только без наворотов максимально простой.

На форме располагаются: 1 - TEdit (поле ввода т.е. где будет путь к сжимаемому .EXE), 2 - TOpenDialog (для выбора .EXE который нужно сжать), 3 - Button (первый Button1 для открытия TOpenDialog, а второй Button2 для запуска "сжатия"). Знаю, что есть манипуляции с CMD.EXE и параметрами. Собственно какие прописывать процедуры

До этого момента писать такие программы не приходилось использовав поиск по форуму нашёл исходник. http://programmersforum.ru/showthread.php?t=132140 но он не сжимает .EXE почему то.

Последний раз редактировалось Ёжик в тумане; 07.08.2012 в 20:07.
Ёжик в тумане вне форума Ответить с цитированием
Старый 07.08.2012, 20:34   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Собственно какие прописывать процедуры
Дальше компонентокидательства вы книгу не читали? Если вообще читали... Вы программист и вам решать какие писать а какие не писать =)

Сам морочился этой дилемой. Понял, что такие заморочки с супер ПО для консольной утилиты - нафиг не нужны
В итоге запилил в оболочку 2 команды с нужными опциями всего-то...

Кидайте upx.exe в папку Windows, далее выполните вот этот REG файл:
Код:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\UPXBest]
@="Упаковать UPX --BEST"

[HKEY_CLASSES_ROOT\*\shell\UPXBest\command]
@="Upx --best --strip-relocs=1 --overlay=strip --compress-exports=1 \"%1\""

[HKEY_CLASSES_ROOT\*\shell\UPXUltra]
@="Упаковать UPX --ULTRA"

[HKEY_CLASSES_ROOT\*\shell\UPXUltra\command]
@="Upx --ultra-brute --all-methods --all-filters  --strip-relocs=1 --overlay=strip --compress-exports=1 \"%1\""

[HKEY_CLASSES_ROOT\*\shell\UPXUnPack]
@="Распаковать UPX"

[HKEY_CLASSES_ROOT\*\shell\UPXUnPack\command]
@="upx -d \"%1\""
И жизнь прекрасна.

Последний раз редактировалось Человек_Борща; 07.08.2012 в 20:37.
Человек_Борща вне форума Ответить с цитированием
Старый 07.08.2012, 20:49   #3
Ёжик в тумане
Подтвердите свой е-майл
 
Регистрация: 20.07.2011
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Дальше компонентокидательства вы книгу не читали? Если вообще читали... Вы программист и вам решать какие писать а какие не писать =)
Читал о компонентокидательстве, ООП и про шаблоны проектирования.
Но негде не написано почему то

Последний раз редактировалось Ёжик в тумане; 07.08.2012 в 20:57.
Ёжик в тумане вне форума Ответить с цитированием
Старый 07.08.2012, 20:57   #4
Ёжик в тумане
Подтвердите свой е-майл
 
Регистрация: 20.07.2011
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Сам морочился этой дилемой. Понял, что такие заморочки с супер ПО для консольной утилиты - нафиг не нужны
В итоге запилил в оболочку 2 команды с нужными опциями всего-то...

Кидайте upx.exe в папку Windows, далее выполните вот этот REG файл:
Код:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\UPXBest]
@="Упаковать UPX --BEST"

[HKEY_CLASSES_ROOT\*\shell\UPXBest\command]
@="Upx --best --strip-relocs=1 --overlay=strip --compress-exports=1 \"%1\""

[HKEY_CLASSES_ROOT\*\shell\UPXUltra]
@="Упаковать UPX --ULTRA"

[HKEY_CLASSES_ROOT\*\shell\UPXUltra\command]
@="Upx --ultra-brute --all-methods --all-filters  --strip-relocs=1 --overlay=strip --compress-exports=1 \"%1\""

[HKEY_CLASSES_ROOT\*\shell\UPXUnPack]
@="Распаковать UPX"

[HKEY_CLASSES_ROOT\*\shell\UPXUnPack\command]
@="upx -d \"%1\""
Мне нужны примеры или процедуры
Вроде таких - ShellExecute(Handle, 'open', 'c:\upx.exe -f....C:\1.exe....', nil, nil, SW_SHOWNORMAL); где будет происходить открытие UPX с параметром и сжатием 1.exe (знаю, что пример не корректный).

То, что в Вашем посте, НЕ ТО!... Я пытаюсь написать программу на подобие UPX Shell самую простенькую.
Ёжик в тумане вне форума Ответить с цитированием
Старый 07.08.2012, 21:52   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

коммандную строку запуска upx для упаковки и распаковки по максимуму можно найти в моем сообщени, если мало, то в док-ии upx'а.

Остальное вы уже сами написали(ShellExecute).
Человек_Борща вне форума Ответить с цитированием
Старый 08.08.2012, 11:13   #6
Ёжик в тумане
Подтвердите свой е-майл
 
Регистрация: 20.07.2011
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
коммандную строку запуска upx для упаковки и распаковки по максимуму можно найти в моем сообщени, если мало, то в док-ии upx'а.

Остальное вы уже сами написали(ShellExecute).
Собственно, да. Код представлен ниже.

Цитата:
procedure TShell.UPXClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'upx.exe', 'program.exe', nil, SW_SHOWNORMAL);
MessageBox(Handle, 'Упаковано!', 'Сообщение', MB_OK or MB_ICONINFORMATION);
end;
end.
Ёжик в тумане вне форума Ответить с цитированием
Старый 08.08.2012, 11:19   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в вашем случае сообщение вылезет раньше чем будет реально упаковано.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.08.2012, 11:22   #8
Ёжик в тумане
Подтвердите свой е-майл
 
Регистрация: 20.07.2011
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в вашем случае сообщение вылезет раньше чем будет реально упаковано.
Ок, тогда можно использовать таймер.
или есть другой способ?

Цитата:
procedure TForm1.Pack_UPXClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'upx.exe', '1.exe', nil, SW_SHOWNORMAL);
Timer2.Enabled:=True;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled:=False;
MessageBox(Handle, 'Упаковано', 'Сообщение', MB_OK or MB_ICONINFORMATION);
end;
На таймере
Timer2.Enabled:=False; вместо True

P.S. При условии, что upx.exe и 1.exe лежат рядом! Оно и понятно

Последний раз редактировалось Ёжик в тумане; 08.08.2012 в 12:19.
Ёжик в тумане вне форума Ответить с цитированием
Старый 08.08.2012, 11:39   #9
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Используйте CreateProcess и Waitforsingleobject, например так
Код:
procedure Start(const s: string);
var
  si: TStartupInfo;
  p: TProcessInformation;
begin
  FillChar(Si, SizeOf(Si), 0);
  with Si do
  begin
    cb := SizeOf(Si);
    dwFlags := startf_UseShowWindow;
    wShowWindow := SW_HIDE;
  end;
  if not CreateProcess(nil, PAnsiChar(s), nil, nil, false,
    CREATE_NEW_CONSOLE or HIGH_PRIORITY_CLASS, nil, nil, si, p)
  then ShowMessage(IntToStr(GetLastError))
 else begin
  if WaitForSingleObject(p.hProcess, 10000) = WAIT_TIMEOUT
  // Waitforsingleobject(p.hProcess, infinite) если надо ждать до конца завершения процесса
   then ShowMessage('10 секунд мне мало :-(');
  CloseHandle(p.hProcess);
end;
...
// Там где надо запустить упаковку
Start('Upx --ultra-brute --all-methods --all-filters  --strip-relocs=1 --overlay=strip --compress-exports=1 c:\program.exe')
...
Конкретно параметры для CreateProcess посмотрите в справке

Последний раз редактировалось astecenko; 08.08.2012 в 11:50.
astecenko вне форума Ответить с цитированием
Старый 08.08.2012, 12:04   #10
Ёжик в тумане
Подтвердите свой е-майл
 
Регистрация: 20.07.2011
Сообщений: 239
По умолчанию

Цитата:
Сообщение от astecenko Посмотреть сообщение
Используйте CreateProcess и Waitforsingleobject, например так
Код:
procedure Start(const s: string);
var
  si: TStartupInfo;
  p: TProcessInformation;
begin
  FillChar(Si, SizeOf(Si), 0);
  with Si do
  begin
    cb := SizeOf(Si);
    dwFlags := startf_UseShowWindow;
    wShowWindow := SW_HIDE;
  end;
  if not CreateProcess(nil, PAnsiChar(s), nil, nil, false,
    CREATE_NEW_CONSOLE or HIGH_PRIORITY_CLASS, nil, nil, si, p)
  then ShowMessage(IntToStr(GetLastError))
 else begin
  if WaitForSingleObject(p.hProcess, 10000) = WAIT_TIMEOUT
  // Waitforsingleobject(p.hProcess, infinite) если надо ждать до конца завершения процесса
   then ShowMessage('10 секунд мне мало :-(');
  CloseHandle(p.hProcess);
end;
...
// Там где надо запустить упаковку
Start('Upx --ultra-brute --all-methods --all-filters  --strip-relocs=1 --overlay=strip --compress-exports=1 c:\program.exe')
...
Конкретно параметры для CreateProcess посмотрите в справке
Спасибо за пример
Ёжик в тумане вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно преобразовать сигнал от джойстика для нужд авиасимулятора Gonsales Помощь студентам 0 09.03.2012 01:31
Delphi для химических нужд RTO Общие вопросы Delphi 0 24.06.2011 21:17
Графическая оболочка для UPX (GUI-UPX) >>arty<< Общие вопросы Delphi 33 13.02.2011 11:38
CMS для конкретных нужд Mixasik WordPress и другие CMS 1 05.02.2011 23:30
Задачка для личных нужд fari Общие вопросы C/C++ 4 07.07.2009 10:51