AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 13.09.2010, 17:24   #1  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
ShellExecute on x64 server
Как выполнить shellexecute на сервере x64? (win2003 ax5 x64)

Собственно сама задача состоит в том чтобы распаковать файл на сервере и импортировать данные в аксу.

Пробовал клиентом запущенным на удаленном рабочем столе (на сервере), распаковка идет нормально. Если через серверный статический метод ругается на "Функция "ShellExecuteExW" в библиотеке DLL "SHELL32" привела к возникновению исключения.".

В результате танцев с бубном, статический метод принял вид:
X++:
public static server void unpack()
{
    CodeAccessPermission permission = new InteropPermission(InteropKind::DllInterop);
    ;

    permission.assert();

    WinAPI::shellExecuteServer("c:\\Program Files\\Microsoft Dynamics AX\\50\\Server\\DSU_WORK\\Bin\\7z.exe e -o\"d:\\install\\7-zip\" \"\\\\192.168.245.59\\in\\zip\\9#33905.126\"");
}
shellExecuteServer это shellExecute с server вместо client

Есть ли у кого какие нибудь свежие идеи по этому поводу?

Geändert von Beast-L (13.09.2010 um 17:26 Uhr)
Alt 14.09.2010, 13:12   #2  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
Решилось написанием Class Library на c#, оттуда вызов shellexecute.

Пока лучше решения не нашел.
Alt 14.09.2010, 13:25   #3  
titov ist offline
titov
Участник
 
73 / 87 (3) ++++
Registriert seit: 23.12.2005
Ort: Казань
WScript.Shell - попробуйте. Взято отсюда
Как разархивировать zip архив?
Alt 14.09.2010, 13:38   #4  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
А чем вызвать скрипт? ShellExecute штатный не работает.
Alt 14.09.2010, 14:05   #5  
gl00mie ist offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.684 / 5813 (201) ++++++++++
Registriert seit: 28.11.2005
Ort: Москва
Blog-Einträge: 3
Zitat:
Zitat von Beast-L Beitrag anzeigen
ShellExecute штатный не работает.
Во-первых, он не штатный - это ваша доделка. Во-вторых, эта тема проскакивала в блогах:
Zitat:
Background of this issue is that on 64bit the DLLFunction kernel class itself is not implemented in Dynamics AX 2009.
Так что забудьте про Win32 API при работе в AX 2009 на сервере.
Zitat:
Zitat von Beast-L Beitrag anzeigen
Решилось написанием Class Library на c#, оттуда вызов shellexecute. Пока лучше решения не нашел.
А лучшего решения и не будет - не даром разработчики выделили отдельный класс WinAPIServer и все методы в нем переписали на .NET (кроме getLastError(), который с давних пор реализован в ядре).

Geändert von gl00mie (14.09.2010 um 14:07 Uhr)
Alt 14.09.2010, 14:13   #6  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
Zitat:
Zitat von gl00mie Beitrag anzeigen
Во-первых, он не штатный - это ваша доделка. Во-вторых, эта тема.
WinAPI::ShellExecute это не моя доделка, а стандартный функционал. Мой ShellExecute через .net работает вполне нормально.
Alt 14.09.2010, 14:09   #7  
titov ist offline
titov
Участник
 
73 / 87 (3) ++++
Registriert seit: 23.12.2005
Ort: Казань
Zitat:
Zitat von Beast-L Beitrag anzeigen
А чем вызвать скрипт? ShellExecute штатный не работает.
X++:
static void ReturnCode_Job(Args _args)
{
COM    wsh             = new COM('WScript.Shell');
int        returnCode1 = -1;
int        returnCode2 = -1;
int        errorCode1 = -1;
int        errorCode2 = -1;
;
 
    returnCode1 = wsh.Run('winrar.exe e -y C:\\1.zip C:\\1\\', 1, true);
    errorCode1 = WinAPI::getLastError();
 
    returnCode2 = wsh.Run('winrar.exe e -y C:\\2.zip C:\\2\\', 1, true);
    errorCode2 = WinAPI::getLastError();
 
    info(strFmt('1.zip: ReturnCode = %1, ErrorCode = %2', returnCode1, errorCode1));
    info(strFmt('2.zip: ReturnCode = %1, ErrorCode = %2', returnCode2, errorCode2));
 
    wsh.finalize();
 
return;
}
код из ссылки, которую я привел
This post has been rated by: Logger (1).
Alt 14.09.2010, 14:20   #8  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
Zitat:
Zitat von titov Beitrag anzeigen
X++:
static void ReturnCode_Job(Args _args)
{
COM    wsh             = new COM('WScript.Shell');
int        returnCode1 = -1;
int        returnCode2 = -1;
int        errorCode1 = -1;
int        errorCode2 = -1;
;
 
    returnCode1 = wsh.Run('winrar.exe e -y C:\\1.zip C:\\1\\', 1, true);
    errorCode1 = WinAPI::getLastError();
 
    returnCode2 = wsh.Run('winrar.exe e -y C:\\2.zip C:\\2\\', 1, true);
    errorCode2 = WinAPI::getLastError();
 
    info(strFmt('1.zip: ReturnCode = %1, ErrorCode = %2', returnCode1, errorCode1));
    info(strFmt('2.zip: ReturnCode = %1, ErrorCode = %2', returnCode2, errorCode2));
 
    wsh.finalize();
 
return;
}
код из ссылки, которую я привел
Метод "Run" в COM-объекте класса "WScript.Shell" возвратил код ошибки 0x80070002 (<неизвестно>), который означает: <неизвестно>.
Alt 14.09.2010, 14:18   #9  
gl00mie ist offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.684 / 5813 (201) ++++++++++
Registriert seit: 28.11.2005
Ort: Москва
Blog-Einträge: 3
WinAPI::shellExecuteServer(), используемый в примере кода из исходного сообщения, - это ваша доделка В AX 2009 серверные методы, как уже упоминалось, вынесены в отдельный класс WinAPIServer.
This post has been rated by: titov (1).
Alt 14.09.2010, 14:21   #10  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
Zitat:
Zitat von gl00mie Beitrag anzeigen
WinAPI::shellExecuteServer(), используемый в примере кода из исходного сообщения, - это ваша доделка В AX 2009 серверные методы, как уже упоминалось, вынесены в отдельный класс WinAPIServer.
В WinAPIServer нет shellexecute. А доделка shellexecuteserver, это по сути тот же shellexecute только на сервере.

Geändert von Beast-L (14.09.2010 um 14:25 Uhr)
Alt 14.09.2010, 20:52   #11  
titov ist offline
titov
Участник
 
73 / 87 (3) ++++
Registriert seit: 23.12.2005
Ort: Казань
Zitat:
Zitat von gl00mie Beitrag anzeigen
В AX 2009 серверные методы, как уже упоминалось, вынесены в отдельный класс WinAPIServer.
две ссылки
http://blogs.msdn.com/b/czdaxsup/arc...m-a-batch.aspx
http://msdn.microsoft.com/en-us/libr...s.process.aspx

ниже почти готовый код для нового метода класса WinAPIServer

X++:
static server void ShellExecuteRunServer()
{
    System.Diagnostics.Process              process;
    System.Diagnostics.ProcessStartInfo     processStartInfo;
    int                                     exitCode;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    process = new System.Diagnostics.Process();
    processStartInfo = new System.Diagnostics.ProcessStartInfo();
    processStartInfo.set_FileName("winrar.exe");
    processStartInfo.set_Arguments("e -y E:\\1\\1.zip E:\\1\\2\\");
    process.set_StartInfo(processStartInfo);
    process.Start();
    process.WaitForExit();
 
    exitCode        = process.get_ExitCode();
    info(strFmt("%1",exitCode ));
    info("Finished");
}
работает!
This post has been rated by: gl00mie (2).
Alt 15.09.2010, 10:19   #12  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
Почемуто виснет на process.WaitForExit();
Alt 15.09.2010, 11:22   #13  
gl00mie ist offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.684 / 5813 (201) ++++++++++
Registriert seit: 28.11.2005
Ort: Москва
Blog-Einträge: 3
Не виснет, а ждет завершения процесса. Правда, если запускать процесс, который сам по себе не завершится, пока пользователь его не прибьет (какой-нить Excel или cmd), тогда, конечно, получится, что Аксапта "виснет". Есть перегруженный вариант метода WaitForExit(), которому можно указать максимальное время, в течение которого следует ожидать завершения запущенного процесса, - можно при желании использовать его, чтоб гарантированно не "висло".
Alt 15.09.2010, 11:33   #14  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
В том то и дело что именно виснет. Скорее все распаковка происходит быстро (архив маленький) и поэтому ждать уже нечего, и событие завершения происходит до вызова ожидания, поэтому и виснет.

Geändert von Beast-L (15.09.2010 um 11:36 Uhr)
Alt 15.09.2010, 12:03   #15  
titov ist offline
titov
Участник
 
73 / 87 (3) ++++
Registriert seit: 23.12.2005
Ort: Казань
Zitat:
Zitat von Beast-L Beitrag anzeigen
В том то и дело что именно виснет. Скорее все распаковка происходит быстро (архив маленький) и поэтому ждать уже нечего, и событие завершения происходит до вызова ожидания, поэтому и виснет.
Windows Server 2008 R2 Ax2009 rollup 4 x64 - intel xeon 4x работает
сделал - архив файла 0(нуль) и 300 Мб. а также команда dir в пустом каталоге, а также несуществующая команда
не удалось повторить ошибку

а вот так что у вас вернет и будет ли результат? по вашей версии процесс уже выполнен и все нормально
X++:
process.Start();
//    process.WaitForExit();
 
    exitCode        = process.get_ExitCode();
    info(strFmt([COLOR=red]"%1"[/COLOR],exitCode ));
Alt 15.09.2010, 12:18   #16  
Beast-L ist offline
Beast-L
Участник
Benutzerbild von Beast-L
 
104 / 21 (1) +++
Registriert seit: 20.10.2006
Ort: Киев
Файл распакован, в результате - 0.
Alt 15.09.2010, 13:18   #17  
titov ist offline
titov
Участник
 
73 / 87 (3) ++++
Registriert seit: 23.12.2005
Ort: Казань
Zitat:
Zitat von Beast-L Beitrag anzeigen
Файл распакован, в результате - 0.
http://msdn.microsoft.com/en-us/library/ty0d8k56.aspx
Zitat:
Zitat von цитата из ссылки
If you pass 0 (zero) to the method, it returns true only if the process has already exited.
Если вы передаете 0 (ноль) к методу, то возвращает истину, только если процесс уже завершился
предлагаю такой вариант
X++:
    while(!process.WaitForExit(0)) //проверяем, что процесс еще не закончен в Х++
    {
        sleep(100);
    }
This post has been rated by: Beast-L (1).
Stichworte
64-bit, aos, ax2009, dllfunction, winapi, zip

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Connection к другому SQL Server Poleax DAX: Программирование 5 19.10.2010 10:49
emeadaxsupport: Unable to validate the AX 2009 Workflow Webservice URL on a Windows Server 2008 R2 x64 Blog bot DAX Blogs 0 05.01.2010 19:16
chrisfie: Project Server 2007 TechNet Webcasts recordings and decks Blog bot DAX Blogs 0 21.07.2009 10:05
dynamicsusers: SQL Server: x64 vs x86 Blog bot DAX Blogs 0 28.06.2007 17:00
aEremenko: Диагностика проблем при установке Microsoft Dynamics Ax 4.0 на Microsoft SQL Server 2005 Blog bot DAX Blogs 0 28.10.2006 16:01

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 02:32 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.