2011-01-12 170 views
1

是否有任何Cocoa或Carbon API來設置打開文件的默認應用程序? 即,如果我選擇一個文件並執行Cmd + i,我們會得到一個選項「打開方式」。在這裏,我們可以設置默認的應用程序來打開文件。此外,還有一個選項可用於所有此類文件。Cocoa API設置文件的默認應用程序以打開

如何以編程方式實現這兩種方式?

回答

1

用於在每個文件基礎上設置應用程序的API是私有的。有關設置處理文件類型的應用程序的信息,請參閱Launch Services Reference中的LSSetDefaultRoleHandlerForContentType和其他方法。

0

有一個碳的API來實現這一點,看到Resource Manager Reference。您必須爲要打開特定應用程序的文件創建一個資源分支,並添加如下所示的資源(非常快速且髒的代碼):

FSRef theFsRef; 
CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path]; 
CFURLGetFSRef(url, &theFsRef); 
HFSUniStr255 fork = {0,{0}}; 
FSGetResourceForkName(&fork); 
Handle theResHandle; 
ResFileRefNum theRefFile; 
ResType rType = 'usro'; 
ResID rID = 0; 
NSMutableData *aData = [[NSMutableData alloc] init]; 
Byte buf[4] = {0x1A, 0x00, 0x00, 0x00}; 
[aData appendData:[NSData dataWithBytes:&buf length:sizeof(buf)]]; 
NSData *bData = [@"/Applications/Firefox.app" dataUsingEncoding:NSUTF8StringEncoding]; 
[aData appendData:bData]; 
int len = 4 + [bData length]; 
[aData appendData:[NSMutableData dataWithLength:(1028-len)]]; 
PtrToHand ([aData bytes], &theResHandle, [aData length]); 
FSCreateResourceFork(&theFsRef,fork.length,fork.unicode,0); 
FSOpenResourceFile(&theFsRef,fork.length,fork.unicode,fsRdWrPerm,&theRefFile); 
AddResource(theResHandle, rType, rID, "\p"); 
WriteResource(theResHandle); 
ReleaseResource(theResHandle); 
UpdateResFile(theRefFile); 
CloseResFile(theRefFile); 
相關問題