Технические вопросы и ответы QA1070

Загрузка сценариев дополнений в Mac OS X

Q: Я хотел бы использовать дополнения сценариев в своем приложении путем отправки мне событий Apple, но я получаю «событие не обработанные» ошибки. Как я загружаю дополнения сценариев?

A: Я хотел бы использовать дополнения сценариев в своем приложении путем отправки мне событий Apple, но я получаю «событие не обработанные» ошибки. Как я загружаю дополнения сценариев?

Во-первых, немного архитектурного фона: В классическом Mac OS пишущие сценарий дополнительные обработчики загружаются во время начальной загрузки в совместно используемую таблицу в масштабе всей системы, а именно, системная таблица обработчика «менеджера по корпоративным мероприятиям Apple». Кроме того, дополнительные обработчики сценариев обновляются каждый раз, когда кто-то отправляет a kASAppleScriptSuite/kGetAEUT событие к обработчику установлено AppleScript. (ID события «gdut» короток для, «получают динамическую пользовательскую терминологию».) AppleScript отправляет себе a kASAppleScriptSuite/kGetAEUT событие, когда это сначала инициализируется и прежде чем это скомпилирует сценарий.

В Mac OS X несколько неверно называется системная таблица обработчика: существует отдельный для каждого приложения, и они не совместно используются вообще, таким образом, каждый должен быть инициализирован отдельно. По причинам производительности это не сделано автоматически как нормальная часть последовательности инициализации приложения - она только сделана, если приложение использует AppleScript или инициализирует саму таблицу.

Самый простой способ загрузить дополнительные записи сценариев в систему таблица обработчика событий Apple состоит в том, чтобы открыть соединение с компонентом AppleScript, как показано в Перечислении 1. В свою очередь, это загрузит дополнения сценариев в дополнительной папке сценариев и обновит записи в системной таблице отгрузки события Apple.

Перечисление 1  , Открывающее соединение с компонентом AppleScript.

theComponent = OpenDefaultComponent(kOSAComponentType, typeAppleScript);

Если Ваше выполнение приложения или компиляции сценарии AppleScript, то необходимо сделать это так или иначе, так просто уверены, что AppleScript инициализируется перед приложением, вызывают какие-либо дополнения сценариев.

Однако, если Ваше приложение только будет интересоваться использованием дополнений сценариев, то инициализация всех AppleScript повлечет за собой дополнительные издержки, которые не могут быть гарантированы. Так, если требуется загрузить дополнения сценариев, не загружая AppleScript, можно сделать так при наличии приложения, отправляют себе a kASAppleScriptSuite/kGetAEUT Событие Apple.

Перечисление 2 показывает исходный код, требуемый сделать это. Каждый раз, когда эту подпрограмму вызывают, она будет синхронизировать набор загруженных дополнений сценариев с содержанием дополнительной папки сценариев. Как правило, Вы только сделали бы это один раз, но вызов его несколько раз будет полезен, если, например, Вы захотите, чтобы Ваше приложение установило новое дополнение сценариев и затем использовало его без перезапуска.

  Демонстрационная подпрограмма перечисления 2 для загрузки или обновления дополнений сценариев.

void LoadScriptingAdditions()
{
    OSErr err;
    AppleEvent e, r;
    ProcessSerialNumber selfPSN = { 0, kCurrentProcess };

    #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_2
    void (*f)();
    CFBundleRef b;

    /* First, call the routine that installs the kASAppleScriptSuite /
       kGetAEUTApple event handler in your applications Apple event dispatch
       table. This part is only required if your application is running in
       Mac OS X 10.0 or 10.1. It is not necessary and will silently fail
       anywhere else (such as when running in Classic or Mac OS 9). */

    b = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.openscripting"));
    if (b != NULL) {
        f = (void (*)()) CFBundleGetFunctionPointerForName(b, CFSTR("OSAInstallStandardHandlers"));
        if (f != NULL) (*f)();
    }
    #endif

    /* Second, send ourselves a kASAppleScriptSuite / kGetAEUT
       Apple event. This will load the scripting additions into our
       application's system Apple event dispatch table - it will also
       refresh the table so it is synchronized with the contents of
       the scripting additions folder. */

    err = AEBuildAppleEvent(kASAppleScriptSuite, kGetAEUT,
        typeProcessSerialNumber, &selfPSN, sizeof(selfPSN),
        kAutoGenerateReturnID, kAnyTransactionID, &e, NULL, "");
    if (err == noErr) {
        AESend(&e, &r, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
        AEDisposeDesc(&e);
        AEDisposeDesc(&r);
    }
}


История версии документа


ДатаПримечания
06.05.2005

Документ OSAInstallStandardHandlers как ненужный в 10,2 и позже.

13.09.2001

Новый документ, объясняющий, как загрузить дополнения сценариев, таким образом, можно вызвать их использующий события Apple.