2013-03-30 1 views
2

У меня есть следующий код в проектеСоздание дескриптора AppleEvent для псевдонима в OS X 10.8

NSAppleEventDescriptor *JHCreateAliasDescriptorForURL(NSURL *aURL) { 
    NSAppleEventDescriptor *retObj = nil; 
    FSRef fsReference; 

    if (CFURLGetFSRef((__bridge CFURLRef)aURL, &fsReference)) { 
     AliasHandle aliasHandle = NULL; 
     OSStatus err = FSNewAliasMinimal(&fsReference, &aliasHandle); 
     if (err == noErr && aliasHandle != NULL) { 

      HLock((Handle)aliasHandle); 
      retObj = [NSAppleEventDescriptor descriptorWithDescriptorType:typeAlias 
          data:[NSData dataWithBytes:*aliasHandle 
               length:GetHandleSize((Handle)aliasHandle)]]; 
      HUnlock((Handle)aliasHandle); 
      DisposeHandle((Handle)aliasHandle); 
     } 
    } 

    return retObj; 
} 

Это создает дескриптор псевдоним, который передает файл в программу, которая не applescriptable но реагирует на это один AppleEvent.

Когда я компилирую это под 10.8, я получаю предупреждение, так как все функции Carbon FSNewAlias* являются устаревшими, и мы должны использовать непрозрачную Закладку NSData объектов из NSURL API. Тем не менее, мне не повезло превратить эти данные в псевдонимы дескрипторов AppleEvent.

Как я могу написать дескриптор typeAlias в 10.8 без FSNewAlias*?

ответ

1

Вы в принципе не можете. (Современная замена для Alias ​​- это CFURLBookmark. Существует обычная программа для создания данных из Alias ​​из закладки, но не наоборот). Однако вы можете использовать , чтобы создать различный файловый дескриптор, который можно использовать для псевдоним - наиболее простым является typeFileURL, где содержимое представляет собой просто байты URL-адреса. Это, по общему признанию, зависит от правильного написания целевого приложения, но оно должно работать.

+0

Я постараюсь, но я подозреваю, что мой приемный приложение выиграл Не делай этого - это очень проприетарное приложение. (Я не называю имена, но это Avid Pro Tools.) – iluvcapra

+1

Я подозреваю, что вы действительно можете использовать принуждение типа в своем собственном коде для создания записи псевдонима из URL-адреса файла без устаревшего API, а затем помещать его в отправляемое событие. То есть, сохраните 'typeFileURL' в записи и затем получите' typeAlias'. Затем сохраните это 'typeAlias'. –

+2

Честно говоря, Авиду пришлось бы уйти с пути, чтобы их сторона не работала. Однако, если бы они это сделали, тогда предложение Кена о принуждении будет работать, за исключением того, что я буду использовать '- [NSAppleEventDescriptor coerceToDescriptorType:]' (или, если хотите, 'AECoerceDesc'). –

0

В случае, если кто-то ищет более прямое решение, то, как это работает хорошо, чтобы создать дескриптор Apple, событие из данных закладки:

+ (NSAppleEventDescriptor *)descriptorWithBookmarkDataForFileURL:(NSURL *)fileURL { 
    NSData *targetBookmarkData = [fileURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:nil]; 
    return [NSAppleEventDescriptor descriptorWithDescriptorType:typeBookmarkData data:targetBookmarkData]; 
} 
+0

Я пробовал это первым, когда у меня возникла эта проблема - ваше решение работает в целом, но не для конкретного приложения, которое я использовал. Он хочет видеть только псевдоним, он не может обрабатывать 'typeBookmarkData'. – iluvcapra

+0

Получил это. Мой ответ на это будет «принуждать его», но похоже, что это то, что вы закончили, но с URL-адресом файла. – AriX

+0

Я думаю, что попробовал, и по какой-то причине это не сработало. Похоже, если вы можете принудить закладку к пути к файлу, который побеждает цель создания закладок. – iluvcapra