在OS X 10.8中为别名创建AppleEvent描述符

时间:2013-03-30 01:33:05

标签: macos applescript appleevents nsappleeventmanager

我在项目中有以下代码

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 API中的不透明书签NSURL对象。但是,我没有把这些数据变成别名AppleEvent描述符的运气。

如何在没有typeAlias的情况下在10.8中创建FSNewAlias*描述符?

2 个答案:

答案 0 :(得分:1)

你基本上不能。 (Alias的现代替代品是CFURLBookmark。有一个从Alias数据创建书签的例程,但不是相反。)然而,你可以做的是创建一种不同类型的文件描述符对别名具有强制性 - 最直接的是typeFileURL,其中内容只是URL的字节。这无疑取决于正确编写的目标应用程序,但它应该可以工作。

答案 1 :(得分:0)

如果其他人正在寻找更直接的解决方案,这样的事情可以很好地从书签数据创建Apple事件描述符:

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