Загрузка сценариев дополнений в 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. |