AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.08.2003, 13:38   #1  
snp123 is offline
snp123
Участник
 
4 / 10 (1) +
Регистрация: 25.08.2003
Адрес: Tomsk
? Запуск приложения с ожиданием его завершения...
На форуме уже была инфа по ShellExecute. НО !!! Таким образом программу можно запускать только АСИНХРОННО от Аксапты А мне требуеться дождаться завершения внешней программы и ТОЛЬКО после этого продолжить выполнение кода в Аксапте. Вариант типа команды pause после shellexecute неприемлем - выполнение происходить без участия пользователя.
В WinApi (не Аксапта, а MS Win) есть функции CreateProcess и WaitForSingleObject. Вопрос - как с их помощью (в смысле желателен код на X++) запустить внешнее приложение. Или хотя бы ссылку на документацию (по Axapta !!!) где описываеться использование ExtTypes, DLL и тому подобное.
Старый 25.08.2003, 14:17   #2  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
int RunWait()
{
COM wsh = new COM("WScript.Shell");
return wsh.Run("calc.exe" , 1, TRUE);
}

также смотри ветку:
Исполнение методов класса на стороне сервера (AOS)?
Старый 25.08.2003, 14:35   #3  
snp123 is offline
snp123
Участник
 
4 / 10 (1) +
Регистрация: 25.08.2003
Адрес: Tomsk
Thumbs up
попробовал, вроде работает.
А задача была следующая - с помощью внешней программы периодически выгружать инфу в DBF и затем обрабатывать, используя данные из Аксапты. Кроме внешней проги ничего не может преобразовать набор исходных данных в DBF.
Старый 25.08.2003, 16:09   #4  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
2 snp123

http://www.axforum.info/forums/showt...=8699#post8699

И еще рекомендую посмотреть help по DTS в MS SQL.
Старый 25.08.2003, 16:49   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Еще есть API функция WaitForSingleObject, предназначенная как раз для таких целей. Но не уверен, что в Аксапте для нее есть обертка. Если нет - придется писать.
Хотя, если вариант SnowMan с Windows Script Host работает - наверное лучше использовать его. Просто есть подозрение, что не на всех ОС это будет работать.
Старый 26.08.2003, 07:00   #6  
snp123 is offline
snp123
Участник
 
4 / 10 (1) +
Регистрация: 25.08.2003
Адрес: Tomsk
2 raz: проблема не в том, что есть данные в DBF и их нужно закидывать в Axapta.
Проблема в том, что только некоторая оригинальная прога может преобразовать из внутреннего формата данных в нормальный DBF. Кстати, а что я смогу найти в доке по DTS ?

2 андре: использоваться программа конвертации будет только на MS win2000 или MS WinXP.
Старый 26.08.2003, 09:10   #7  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
2 snp123

Просто DTS позволяет перегонять данные и запускать разные задачи (в том числе и внешние).

Возможно есть вариант дать команду SQL и он выполнит неоходимый Job, который мог бы, например, запустить внешнюю программу, потом результаты ее работы загрузить в SQL, а в Аксапте надо было бы только дождатся появления данных, забрать их через ODBC.
Старый 26.08.2003, 11:53   #8  
snp123 is offline
snp123
Участник
 
4 / 10 (1) +
Регистрация: 25.08.2003
Адрес: Tomsk
Lightbulb
доки у меня нет но покопаться в дтс попробую вдруг что интересное получиться...
Старый 26.01.2010, 13:42   #9  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
Ай нид хелп. Выполнение run с третьим параметром равным "true" не ждет завершения отработки:
X++:
    wsh = new COM('WScript.Shell');
    wsh.Run(strFmt("winrar.exe e -y -o+ %1 %2",fileName,temppath), 0, true);
    wsh.finalize();

    fullFileName = SysTreeNode::duplicatePathDelimiters(< >);
    if(!winapi::fileExists_RU(fullFileName))
        throw error("Нема файлка!");
сообщает, что файл не найден при любых раскладах, хотя, если в дебагере "немножко постоять" после Run, то файл чудесным образом обнаруживается.
Не подскажете как быть?
P.S. Выполняю на Windows XP. Axapta 3.0
Старый 26.01.2010, 15:01   #10  
EAlex is offline
EAlex
Участник
 
27 / 14 (1) ++
Регистрация: 30.01.2004
Попробуйте вот это.

X++:
static void shellExecuteWait(str commandLine, int _waitTime = -1, int cmdShow = 4)
{
//  Ожидание завершения работы приложения  commandLine.
    #WinAPI
    #DEFINE.STATUS_TIMEOUT(0x00000102)

    Dll             kernel32            = new Dll("kernel32.dll");
    DllFunction     createProcess       = new DllFunction(kernel32, "CreateProcessA");
    DllFunction     waitForSingleObject = new DllFunction(kernel32, "WaitForSingleObject");
    DllFunction     closeHandle         = new DllFunction(kernel32, "CloseHandle");
    DllFunction     terminateProcess    = new DllFunction(kernel32, "TerminateProcess");
    Binary          strartupInformation = new binary(68);
    Binary          processInformation  = new binary(16);

    int             hProcess;

    createProcess.returns(ExtTypes:: DWORD);
    createProcess.arg(ExtTypes:: DWORD, ExtTypes:: STRING,
                      ExtTypes:: DWORD, ExtTypes:: DWORD,
                      ExtTypes:: DWORD, ExtTypes:: DWORD,
                      ExtTypes:: DWORD, ExtTypes:: DWORD,
                      ExtTypes:: POINTER, ExtTypes:: POINTER);

    waitForSingleObject.returns(ExtTypes:: DWORD);
    waitForSingleObject.arg(ExtTypes:: DWORD, ExtTypes:: DWORD);

    closeHandle.returns(ExtTypes:: DWORD);
    closeHandle.arg(ExtTypes:: DWORD);

    terminateProcess.returns(ExtTypes:: DWord);
    terminateProcess.arg(ExtTypes:: DWord, ExtTypes:: DWord);

    strartupInformation.dWord(44, cmdShow);

    if (!createProcess.call(0, commandLine, 0, 0, 0, 0, 0, 0, strartupInformation, processInformation))
    {
        throw error(strfmt("Ошибка при запуске приложения \"%1\"", commandLine));
    }

    hProcess = processInformation.dWord(0);

    if (waitForSingleObject.call(hProcess, _waitTime) == #STATUS_TIMEOUT)
    {
        terminateProcess.call(hProcess, 1);
        throw error(strfmt("Приложение \"%1\" закрыто, так как не завершилось за отведенное ему время", commandLine));
    }

    closeHandle.call(hProcess);
}
За это сообщение автора поблагодарили: konfet (1), tricky (1).
Старый 26.01.2010, 15:17   #11  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
Цитата:
Сообщение от EAlex Посмотреть сообщение
Попробуйте вот это.
...
Спасибо, работает.
Но только вот так
X++:
MyTestGlobal::shellExecuteWait(strFmt("C:\\Progra~1\\WinRAR\\WinRAR.exe e -y -o+ %1 %2",fileName,temppath));
а хотелось бы вот так:
X++:
MyTestGlobal::shellExecuteWait(strFmt("WinRAR.exe e -y -o+ %1 %2",fileName,temppath));
т.к. не обязательно у пользователя ВинРар будет установлен в указанной директории. Есть ли возможность узнать, установлено ли приложение у пользователя и по какому пути оно располагается?
Старый 26.01.2010, 22:46   #12  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от tricky Посмотреть сообщение
т.к. не обязательно у пользователя ВинРар будет установлен в указанной директории. Есть ли возможность узнать, установлено ли приложение у пользователя и по какому пути оно располагается?
Можно сделать следующее:
1. Предположить что Winrar всегда будет стоять в Program Files. Путь к Program Files можно определить из переменной окружения %ProgramFiles% (cmd.exe echo %ProgramFiles%). Это поможет в случае установки Windows на разные диски.

2. В реестре (Windows 2008 Server, Vista) есть ветка HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe, у которой есть значение по умолчанию - полный путь к Exe-шнику и значение Path - соответственно - путь только к каталогу. Можно проанализировать эту ветку на предмет получения пути.
В общем случае - можно поискать в реестре по ключевому слову WinRAR чтобы понять где какая информация хранится.

Но в случае реестра есть маленькая ложка дегтя. Структура реестра в Vista / Server 2008 немного отличается от предыдущих версий Windows и есть риски "не найти в ожидаемом месте" информацию в реестре для разных ОС.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: tricky (1).
Старый 27.01.2010, 11:39   #13  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Или не много поставить по другому задачу ...
1. пользоваться не WinRar.exe, а просто rar.exe
2. его не нужно инсталировать и его можно просто скопировать в известную нам папку (например с:\temp , а тут варианты ...
2.1. копировать из известного места в сети
2.2. можно сделать поле в настроечной таблице типа контейнер. В это поле загрузить rar.exe. при вызове процедуры архивирования - проверять есть ли в указанном месте rar.exe ... и дальше понятно.
по моему немного проще чем анализировать реестр и вообще аксой напрямую лазить по реестру
За это сообщение автора поблагодарили: sukhanchik (2), tricky (1).
Теги
shellexecute, winapi, запуск

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Запуск AOS DAX4 в качестве консольного приложения gl00mie DAX: Администрирование 12 05.11.2021 22:10
DAX 4.0 SP1: Запуск клиента с сети petergunn DAX: База знаний и проекты 15 27.04.2009 00:10
Запуск отчета в Dynamics AX 3.0 SP5 из внешнего приложения polygris DAX: Программирование 4 01.12.2008 12:40
Запуск Axapta 3.0 Object Server Manager в качестве консольного приложения gl00mie DAX: Администрирование 2 15.11.2007 11:12
перенос приложения kitty DAX: Администрирование 8 04.07.2006 13:08

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:52.