Показать сообщение отдельно
Старый 21.01.2009, 15:59   #1  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
DAX 4.0: infolog & workspaceNum
Для начала небольшая симуляция в качестве разминки: запускаем клиент Dynamics AX 4.0 и открываем из него дополнительно 2 рабочие области.
Закрываем рабочую область с номером 2 - таким образом остаются 2 окна: 'Microsoft Dynamics AX - 1...' и 'Microsoft Dynamics AX - 3...' (с 'дыркой' в последовательности).

Не запуская приведенный ниже job попробуйте ответить что будет выведено в infolog: количество строк и текст?
X++:
static void jbEnumerateWorkspace(Args _args)
{
    HWND    hWndWorkspace   ;
    int     workspaceNum    ;
    
    #define.WorkspaceCount(3)
    ;
    
    try
    {
        for( workspaceNum =1 ; workspaceNum <=#WorkspaceCount; workspaceNum++ )
        {
            info( strfmt( "Workspace num: %1", workspaceNum ) ) ;
            hWndWorkspace = infolog.hWnd( workspaceNum ) ;
            info( hWndWorkspace ? strfmt( "Workspace HWND: %1", hWndWorkspace) : "Workspace HWND: oops :(" ) ;
        }
    }
    catch
    {
        info( strfmt( "catched in %1", funcname() ) ) ;
    }

    info( 'finished' ) ;
}
Теперь запускаем job и можно проверить свои выводы.
Тестировалось на 2 приложениях: kernel version 4.0.2163.0 и kernel version 4.0.2501.116

Результат, который был получен в infolog на этих релизах:
Цитата:
Workspace num: 1
Workspace HWND: 1234567
Workspace num: 2
т.е. вызов infolog.hWnd(...) на второй итерации цикла с номером несуществующей (закрытой уже) рабочей области привел к 'аварийному' завершению выполнения прикладного кода, при этом эта ситуация не была перехвачена в блоке catch. Аналогичная ситуация с вызовом другой функции ожидающей в качестве параметра workspaceNum: infolog.taskPane( ... ) (отличие - infolog.taskPane( 0 ) отрабатывает корректно)

С 'наскоку' не обнаружил в DAX 4.0 штатной функциональности позволяющей проверить валидность workspaceNum или получить их текущий набор (функция infolog.getWorkspaceList() возвращает контейнер с HWND открытых рабочих областей)

P.S. Склонен отнести это bug'ам если приведенный сценарий воспроизводится и на более поздних версиях kernel Dynamics Ax 4.0.
За это сообщение автора поблагодарили: kashperuk (3).