Запуск редактора бизнес-процесса программно

Автор nnspu, 01.04.22, 16:54:02

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

nnspu

Добрый день!
При редактировании бизнес-процесса запускается программа LWFDesign.exe. Пробовал ли кто-нибудь запустить этот редактор программно, передав ему, например, идентификатор бизнес-процесса?
Пробовал мониторить с использованием ProcMon, передаются ли параметры через командную строку при запуске редактирования - программа запускается без них.
Возникла мысль, что передаются сообщения дескриптору окна после старта приложения. Так, например, при запуске редактора из конфигуратора workflow на типовом БП видно, что отсылается сообщение (WM_USER + 202) с параметром, равным идентификатору бизнес-процесса. Но ручная отправка таких сообщений ни к чему не приводит.
Есть у кого-нибудь другие идеи?

Chaa

Для версии 2011 и старше. В ранних версиях по-другому.
procedure OpenRouteInDesigner(const AAppHandle: THandle;
    const ABase: String; const ARouteID: Integer);
var
    LHandle: THandle;
    LData: COPYDATASTRUCT;
    LCommand: AnsiString;

    procedure StartDesigner(const ADoFind: Boolean);
    var
        SI: TStartupInfo;
        PI: TProcessInformation;
        CmdLine: String;
        RetryNo: Integer;
    begin
        CmdLine := Format('%sWorkFlow\LWFDesign.exe', [GetLoodsmanPath()]);
        FillChar(SI, SizeOf(SI), 0);
        FillChar(PI, SizeOf(PI), 0);
        SI.cb := SizeOf(SI);
        SI.dwFlags := STARTF_USESHOWWINDOW;
        SI.wShowWindow := SW_NORMAL;

        SetLastError(ERROR_INVALID_PARAMETER);
        Win32Check(Windows.CreateProcess(nil, PChar(CmdLine), nil, nil, False,
            CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI));
        WaitForInputIdle(PI.hProcess, 1000);

        // В версии 2014 сначала показывается заставка, а только потом создается
        // окно дизайнера. Поэтому ждем создания окна
        if ADoFind then
        begin
            RetryNo := 0;
            while FindWindow('TFormDesigner', nil) = 0 do
            begin
                if RetryNo > 10 then
                    break;
                Sleep(1000);
                WaitForInputIdle(PI.hProcess, 1000);
                inc(RetryNo);
            end;
        end;

        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
    end;
begin
    StartDesigner(True);
    LHandle := FindWindow('TFormDesigner', nil);
    if LHandle <> 0 then
    begin
        LData.dwData := ARouteID;
        LCommand := 'WorkFlowDesignerLoadBusinessProcess=' + AnsiString(ABase);
        LData.cbData := Length(LCommand);
        LData.lpData := PAnsiChar(LCommand);
        SendMessage(LHandle, WM_COPYDATA, WPARAM(AAppHandle), LPARAM(@LData));
    end;
end;