Выполнить командную строку из потока выполнения службы - PullRequest
1 голос
/ 23 ноября 2011

На первый взгляд мне не повезло с

uses ShellApi;

...

ShellExecute(Handle, pchar('open'), pchar('emf2pdf.exe'), 
             pchar(s), pchar(root), SW_SHOWNORMAL);

, где s - строка параметра, а root - каталог, в котором находится команда.

Ошибка, которую я получаю,«отсутствует оператор или точка с запятой», а также «слишком много фактических параметров».

Вероятно, что-то легкое, что я упустил из виду, немного подчеркнул.Даже не уверен, где взять дескриптор.

Будьте рады альтернативным способам выполнения командной строки, которые вы можете предложить!По сути, служба ищет файлы для преобразования через равные промежутки времени, поэтому я просто ищу способ сформировать командную строку, такую ​​как в DOS, и выполнить ее, желательно, чтобы окно не появлялось на короткое время и не закрывалось, но я возьму то, чтоЯ могу получить.:)

Моя правильная установка Delphi может подсказать мне параметры кода, но не вызвать всплывающую страницу справки при нажатии клавиши F1 (не найдено в индексе).

Обновление: использовалась эта функция CreateProcessиз DelphiPages:

Function ExecuteAndWait(sExecutableFile : String; wWindowState : Word = SW_SHOWNORMAL) : Boolean;
var
siInfo : TStartUpInfo;
piInfo : TProcessInformation;
begin
    FillChar(siInfo, SizeOf(siInfo), #0);

    with siInfo do begin
    cb := SizeOf(siInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := wWindowState;
    end;
    Result := CreateProcess(NIL, pChar(sExecutableFile), NIL, NIL, FALSE, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL, pchar(ExtractFilePath(sExecutableFile)),siInfo, piInfo);
    if Result then
    WaitForSingleObject(piInfo.hprocess,INFINITE);
end;

И затем вызвал его с помощью этой командной строки, которая работает при вставке в 'cmd', но не с этим кодом:

ExecuteAndWait('D:\EMF2PDF\emf2pdf.exe -append 0 -margin 36x36x36x36 -width 595 -height 420 "D:\EMF2PDF\EMF\example.emf" "D:\EMF2PDF\PDF\example.pdf"');

Я был бы рад, если выможет предоставить (ссылку на) рабочий пример вызова (в службе) командной строки консольного приложения выше.

ОБНОВЛЕНИЕ: рассматриваемая команда не открывает окно, а набирает статистику преобразования в консоли.Я использую загружаемое здесь программное обеспечение: http://www.verydoc.com/emf-to-pdf.html

Кроме того, до сих пор мне не сообщали, что рассматриваемый сервер является виртуальным сервером, если это имеет значение.

Проверено только сейчас,и когда я опробую свой сервис, я вошел в систему как удаленный пользователь сеанса.Разве служба не сможет хотя бы создать процесс, который вызывает emf2pdf, когда Windows работает с вошедшим в систему пользователем?

Если вы можете подумать об альтернативных решениях для использования программного обеспечения Verydoc, любое вообще, в разделеэти условия или другие, на этом сервере (например, пакетный пользователь) я хотел бы попробовать их!

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

Служба запускается в другом сеансе и, следовательно, в другой выигрышной станции, поэтому вы не можете использовать ShellExecute, поскольку у выигрышной станции обслуживания вообще нет оболочки;не может быть зарегистрированного пользователя и т. д. и т. д. Единственный, но интерактивный сервис, но он больше не поддерживается в более новой версии Windows (от Vista и выше, если я правильно помню).

Как упоминал Дэвид впримечания ниже: должна быть возможность запустить процесс с помощью:

ShellExecute(0, 'open', 'sleep.exe', '60', '', SW_HIDE);

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

0 голосов
/ 24 ноября 2011

У нас была точно такая же проблема здесь. Мы также создавали PDF с помощью инструмента командной строки.

Если вы посмотрите на свойства вашего сервиса в диалоге сервисов, вы можете увидеть флажок на вкладке «вход». Флажок «Разрешить сервису взаимодействовать с рабочим столом». Установите для этого флажка.

Один из ответов здесь указывает, что это больше невозможно в более новых версиях Windows, но оно прекрасно работает на Windows 7 и Windows 2008 server.

Редактировать: настройка в свойствах сервиса, возможно, изменила его значение, я не знаю об этом. Но это решило нашу проблему. Наш инструмент командной строки для создания PDF-файлов прекрасно работает после установки этого флажка.

0 голосов
/ 24 ноября 2011

Ваше обновление к вопросу сообщает, что вызов CreateProcess работает при запуске из стандартного приложения, но завершается неудачно при запуске из службы. Эта проблема, безусловно, связана с изоляцией служб в сеансе 0. Имея эту информацию, я могу придумать следующие объяснения:

  1. В контексте службы путь D:\EMF2PDF\... недоступен. Убедитесь, что вы можете создать и открыть текстовый файл здесь, чтобы увидеть, является ли этот диагноз истинным.
  2. Изоляция сеанса 0 просто несовместима с программой emf2pdf. Если это так, то вам нужно будет найти другую программу для преобразования. Это может быть трудно сделать, потому что это программа, которая обрабатывает EMF, может использовать команды GDI, и они с большой вероятностью потерпят неудачу в контексте службы.

Безусловно, самым простым решением будет запустить этот процесс как стандартное приложение. Я вижу, что это может не быть приемлемой перспективой для того, что выглядит как серверная служба.

...