Как запустить внешнее приложение с передачей ему параметра?

Обсуждение SCADA-системы Wonderware: InTouch ME, InTouch Edge HMI, InTouch, InTouch OMI и System Platform
Андрей
Сообщений в теме: 2
Сообщения: 39
Зарегистрирован: 28 фев 2011, 11:39

Как запустить внешнее приложение с передачей ему параметра?

#1

Сообщение Андрей » 11 апр 2011, 15:56

Столкнулся с такой ситуацией, формируется отчет в виде файла .xlsx, чтобы его просмотреть вызывается MS Excel с передачей в качестве параметра пути к файлу отчета. Сначала я пытался использовать функцию StartApp, но не получилось, т.к. функция в качестве параметра воспринимает только тег сообщения, а в нем помещается строки максимум в 131 символ ( :evil:), а локальную переменную типа MESSAGE не воспринимает в качестве параметра. Что делать?



Аватара пользователя
alex
Администратор
Сообщений в теме: 1
Сообщения: 1745
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 47 раз
Поблагодарили: 102 раза
Контактная информация:

Re: Как запустить внешнее приложение с передачей ему парамет

#2

Сообщение alex » 12 апр 2011, 15:35

Локальная переменная типа MESSAGE не спасет, т.к. в нее строка помещается тоже длиной не более 131 символа. Поэтому тут надо использовать другой подход. Например, использовать внешние возможности через DLL, COM-объекты и т.д., это как идея.



Андрей
Сообщений в теме: 2
Сообщения: 39
Зарегистрирован: 28 фев 2011, 11:39

Re: Как запустить внешнее приложение с передачей ему парамет

#3

Сообщение Андрей » 12 апр 2011, 16:12

Ну в общем я наше более-менее подходящее решение... В двух словах генерирую в Quick-функции файл со скриптом на VBScript и запускаем это файл с помощью стандартной функции StartApp.

Более подробно что мы получили в итоге:

1. Файл со скриптом, который надо сгенерировать:

Код: Выделить всё

Set wshShell = Wscript.CreateObject("WScript.Shell")
wshShell.Exec """C:\Program Files\Microsoft Office\OFFICE12\Excel.exe"" ""D:\test.xlsx"""
Set wshShell = nothing

2. Cобственно код Quick-фукнции:

Код: Выделить всё


   {
        Вход: AppName - полный путь к приложению;
                 Param - параметр или список параметров передаваемых приложению;
                 IsParamQuote - Надо ли параметр брать в кавычки, например путь к файлу имеющий пробелы в пути.

      Выход:  0 - ошибка работы функции подробности в журнале;
                   1 - функция успешно выполнена.
   }

    DIM result AS DISCRETE;
    DIM ScrtiptName AS MESSAGE;
    DIM cmd AS MESSAGE;
    DIM filename AS MESSAGE;

    ScrtiptName = "QuikFunction myStartApp: ";
    filename = "c:\myStartApp_2214F93E_CDB2_487c_A0A5_76D45EF23B7D.vbs";
    result = 0;   

    IF StringLen (AppName) == 0 THEN
        LogMessage (ScrtiptName + ": Передан пустая строка, StringLen (AppName) == 0");
        RETURN 0;
    ENDIF;

    OLE_CreateObject (%FSO, "Scripting.FileSystemObject");

    result = OLE_IsObjectValid (%FSO);

    IF result == 0 THEN
        LogMessage (ScrtiptName + "Ошибка создания объекта, объект не доступен, OLE_IsObjectValid ('Scripting.FileSystemObject')==0");
        RETURN 0;
    ENDIF;

    %FS = %FSO.CreatetextFile (filename,1,0);
    result = OLE_IsObjectValid (%FS);

    IF result == 0 THEN
        LogMessage (ScrtiptName + "Ошибка создания объекта, объект не доступен, OLE_IsObjectValid ('Scripting.TextStream')==0");
        OLE_ReleaseObject(%FSO);
        RETURN 0;
    ENDIF;

    %FS.WriteLine ("Set wshShell = Wscript.CreateObject(" + StringChar(34) + "WScript.Shell" + StringChar (34) +")");
    %FS.Write ("wshShell.Exec" + " " + StringChar (34) + StringChar (34)+ StringChar (34));
    %FS.Write (AppName);
    %FS.Write (StringChar (34) + StringChar (34) + " ");
    IF IsParamQuote == 1 THEN
        %FS.Write (StringChar (34) + StringChar (34));
    ENDIF;
    %FS.Write (Param);
    IF IsParamQuote == 1 THEN
        %FS.Write (StringChar (34) + StringChar (34));
    ENDIF;
    %FS.WriteLine (StringChar (34));
    %FS.WriteLine ("Set wshShell = nothing");

    %FS.Close();

    OLE_ReleaseObject(%FS);
    OLE_ReleaseObject(%FSO);

    StartApp ("wscript.exe c:\myStartApp_2214F93E_CDB2_487c_A0A5_76D45EF23B7D.vbs");

    RETURN result;

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




Если эта тема может быть полезна другим, поделитесь ссылкой:

Вернуться в «Wonderware: InTouch ME, InTouch Edge HMI, InTouch, InTouch OMI и System Platform»