0

我已经厌倦了内置的openMac OS X 命令,主要是因为它使用您的实际用户 ID 而不是有效用户 ID 运行程序;这会导致sudo open Foo使用您的帐户而不是帐户打开 Foo 及其关联的应用程序root,这让我很恼火。所以我决定做一些替代品。

到目前为止我已经成功了:我可以在open -aoropen -b方式下打开任何程序,并且支持可选等待。我正在NSTask为此目的使用。

但是,我也希望能够打开文档。据我所知,您需要使用NSWorkspace它,但是使用NSWorkspace启动程序会导致它们使用您的帐户凭据而不是命令行程序的凭据启动。这正是默认open工具所做的,而这正是我不想要的。

那么,我怎样才能有一个程序请求另一个程序在不使用的情况下打开一个文档NSWorkspace?从NSTask对象中,我可以获得进程 ID,仅此而已。

4

1 回答 1

1

希望这可以解决问题:

- (void)openFile:(NSString *)filePath withTask:(NSTask *)task {
    int pid = [task processIdentifier];
    NSAppleEventDescriptor *target = [NSAppleEventDescriptor descriptorWithDescriptorType:typeKernelProcessID bytes:&pid length:sizeof(pid)];

    const char *urlUTF8 = [[[NSURL fileURLWithPath:filePath] absoluteString] UTF8String];
    NSAppleEventDescriptor *urlDescriptor = [NSAppleEventDescriptor descriptorWithDescriptorType:typeFileURL bytes:urlUTF8 length:strlen(urlUTF8)];

    NSAppleEventDescriptor *event = [NSAppleEventDescriptor appleEventWithEventClass:kEventParamAppleEvent eventID:kAEOpen targetDescriptor:target returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID];
    [event setParamDescriptor:urlDescriptor forKeyword:keyDirectObject];

    OSStatus err = AESendMessage([event aeDesc], NULL, kAENoReply | kAENeverInteract, kAEDefaultTimeout);

    if (err != noErr) {
        // Error handling goes here
    }

    // Activate the application

    event = [NSAppleEventDescriptor appleEventWithEventClass:kAEMiscStandards eventID:kAEActivate targetDescriptor:target returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID];
    err = AESendMessage([event aeDesc], NULL, kAENoReply | kAENeverInteract, kAEDefaultTimeout); 
}

您可能必须使用 an 启动应用程序NSTask,然后向其发送适当的 open Apple Event。

实际上,您可以使用 an 启动 NSTask,然后在 NSWorkspace知道文件正在运行后通过它打开文件吗?或者这是否会在您的用户下启动应用程序的新实例?

原回复:

open -a SomeApplication SomeFile

工作?

于 2010-03-25T23:35:38.277 回答