Как запустить программу командной строки в Delphi?

С помощью swizzling «helper» методов, включенных в ConciseKit , вы фактически вызываете реализацию по умолчанию ... достаточно странно .. путем вызова вашей реализации SWIZZLED ..

Вы установили его в + (void) load, вызвав + (BOOL)swizzleMethod:(SEL)originalSelector with:(SEL)anotherSelector in:(Class)klass;, то есть

[$ swizzleMethod:@selector(oldTired:) 
            with:@selector(swizzledHotness:) in:self.class];

, а затем в swizzled method .. давайте предположим, что он возвращает -(id) .. вы можете сделать свое зло , или по какой-либо причине вы в первую очередь задираете ... а затем вместо возвращения объекта или self или еще чего ...

return [self swizzledHotness:yourSwizzledMethodsArgument];

Как объясняется здесь ...

В этом методе похоже, что мы снова вызываем тот же метод, вызываем и бесконечную рекурсию. Но к тому времени, когда эта линия будет достигнута, оба метода были заменены. Поэтому, когда мы вызываем swizzled_synchronize, мы на самом деле вызываем оригинальный метод.

blockquote>

Он чувствует и выглядит странно, но .. он работает. Это позволяет добавлять бесконечные приукрашивания к существующим методам и по-прежнему «называть супер» (фактически «я») и использовать преимущества ручной работы оригинального метода ... даже без доступа к исходному источнику.

23
задан Georg Fritzsche 8 April 2010 в 17:45
поделиться

1 ответ

Пример использования ShellExecute () :

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(0, nil, 'cmd.exe', '/C find "320" in.txt > out.txt', nil, SW_HIDE);
  Sleep(1000);
  Memo1.Lines.LoadFromFile('out.txt');
end;

Обратите внимание, что использование CreateProcess () вместо ShellExecute () позволяет для лучшего контроля над процессом.

В идеале вы также должны вызвать это во вторичном потоке и вызвать WaitForSingleObject () на дескрипторе процесса, чтобы дождаться завершения процесса. Sleep () в этом примере - это просто способ подождать некоторое время, пока программа, запущенная ShellExecute () , завершится - ShellExecute () не будет работать который. В противном случае вы не могли бы, например, просто открыть экземпляр блокнота для редактирования файла, ShellExecute () заблокировала бы ваше родительское приложение до тех пор, пока редактор не будет закрыт.

31
ответ дан 29 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: