【问题标题】:How can I access the Apple Events "openFile" event in C++?如何在 C++ 中访问 Apple Events“openFile”事件?
【发布时间】:2012-01-22 09:13:15
【问题描述】:

我有兴趣用 C++ 编写一个用于 Mac OS X 的小实用程序来读取、解析、保存(覆盖)文件。我不需要任何 GUI、菜单或窗口。

  1. 在 XCode 中我需要从什么类型的项目模板开始?
  2. 如何访问传入的文件? (它通过 Apple Events openFile 传递,对吗?)

我做了一点 C++,但在 Mac 上什么也没有。链接赞赏,代码示例赞赏更多。

【问题讨论】:

    标签: c++ c xcode macos cocoa


    【解决方案1】:

    您打算如何将文件传递给您的应用程序?

    如果是通过命令行,那么您将使用命令行工具模板并访问命令行参数,就像在任何 POSIX 平台(argcargv)上一样。

    如果您想使用 Finder 将文件传递给您的应用程序,例如,通过将文件拖放到应用程序图标上,那么您将使用 Cocoa 应用程序模板。

    Info.plist 文件包含您的应用程序配置和支持的文档类型,类似于 Windows 上的注册表。

    1. 您可以通过项目设置的“信息”选项卡配置 Info.plist(它是 XCode 文件导航器中最顶层的文件)。单击右下角的“添加”按钮,然后选择“添加文档类型”以添加您的应用程序将接受的文档类型。要接受所有文档,请将文档名称设置为 All,并将扩展名设置为 *More info is here

    2. 在 Info.plist 中添加一个 LSUIElement 键,并将其值设置为 YES 以指示您的应用程序没有 UI。该键在 XCode 中也显示为“Application is agent”。 More info on LSUIElement is here.

    3. 在 MainMenu.xib 中,您可以删除默认存在的 Window 和 Font Manager 对象,因为您不需要它们。

    4. 将 AppDelegate.m 文件重命名为 AppDelegate.mm,以便将其编译为 Objective-C++。这将允许您在该文件中使用 C++ 代码。

    5. applicationDidFinishLaunching: 委托方法中,添加 [NSApp terminate:nil]; 以便您的应用在完成工作后立即退出。

    将以下方法添加到 AppDelegate.mm:

    - (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
    {
        NSLog(@"Opening file %@", filename);
    
        char* cFilename = [filename UTF8String];    
    
        // Your C++ code goes here
    
        return YES;
    }
    

    就是这样。剩下的就是你的 C++ 代码。您可以根据需要将任何 C++ 代码添加到 AppDelegate.mm。例如:

    #include <string>
    #include <iostream>
    #include "MyCppFileProcessor.h"
    
    - (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
    {
        std::string cFilename([filename UTF8String]);
        std::cout << "Processing file: " << cFilename << std::endl;
    
        MyCppFileProcessor fileProcessor;
        fileProcessor.processFile(cFilename);
    
        return YES;
    }
    

    只要您将文档拖放到 Finder 中的应用程序图标上,此代码就会运行。

    【讨论】:

    • 刚刚有机会回到这里!哇!看起来很棒!迫不及待想试一试!第二部分正是我想要的!非常感谢!
    • 嘿@Darren - 我有一个后续问题,你能帮忙吗? - stackoverflow.com/questions/8917874
    【解决方案2】:

    1) 使用命令行工具模板。此模板有几个选项。您可以从菜单中选择 C++。

    2) 据我所知,IOstream 可以正常工作。另外,你的 main() 函数上有一个参数参数,你可以从这些 args 中获取文件名。

    http://www.cplusplus.com/reference/iostream/

    【讨论】:

    • IOstream 是否可以通过 Apple Events 获取文件名?它们不作为标准命令参数传递。
    猜你喜欢
    • 2011-07-05
    • 2011-02-23
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多