Как я могу идентифицировать среду выполнения, Углерод или Какао, текущего приложения?
Q: Как я могу идентифицировать среду выполнения, Углерод или Какао, текущего приложения?
A: Можно идентифицировать среду выполнения текущего приложения путем вызова ProcessInformationCopyDictionary API (в Processes.h) и исследование значения ключа «Flavor». Этот API поддерживается в Mac OS X v10.2 и позже.
Это полезно при разработке плагинов, платформ, методов ввода, статических библиотек, и т.д., когда Вы будете не всегда знать, в которой среде выполнения, Углероде, Какао, или даже Классике Mac OS, Ваш код собирается работать. Большую часть времени Вы не заботились бы об этой среде выполнения, но если бы Вы обрабатываете Элементы пользовательского интерфейса, некоторые ситуации могут возникнуть при знании, что среда выполнения упростила бы запись кода.
Для удобства можно использовать следующую функцию, возвращающую разновидность запущенного приложения:
Перечисление 1 GetApplicationFlavor.
SInt32 GetApplicationFlavor(void) |
{ |
// GetApplicationFlavor returns: |
// -1 if the application flavor could not be identified |
// 0 if the application is a Mac OS Classic application |
// 2 if the application is a Carbon application |
// 3 if the application is a Cocoa application |
static SInt32 flavor = -1; |
OSStatus status; |
CFDictionaryRef processInfoDict = NULL; |
CFNumberRef processInfoFlavor = NULL; |
if (flavor == -1) |
{ |
ProcessSerialNumber psn; |
status = GetCurrentProcess(&psn); |
require_noerr(status, GetCurrentProcess); |
processInfoDict = ProcessInformationCopyDictionary(&psn, kProcessDictionaryIncludeAllInformationMask); |
require(processInfoDict != NULL, ProcessInformationCopyDictionary); |
processInfoFlavor = CFDictionaryGetValue(processInfoDict, CFSTR("Flavor")); |
require(processInfoFlavor != NULL, CFDictionaryGetValue); |
CFNumberGetValue(processInfoFlavor, kCFNumberSInt32Type, &flavor); |
} |
CFDictionaryGetValue: |
ProcessInformationCopyDictionary: |
GetCurrentProcess: |
if (processInfoFlavor != NULL) |
CFRelease(processInfoFlavor); |
if (processInfoDict != NULL) |
CFRelease(processInfoDict); |
return flavor; |
} |
История версии документа
| Дата | Примечания |
|---|---|
| 19.03.2010 | Удаленный ссылка на ошибку (Радар № 3823210), который был закрыт, и исходное описание примера кода корректно. |
| 07.11.2006 | Новый документ, идентифицирующий среду выполнения приложения. Полезный только для плагинов, платформ, методов ввода, и т.д. |