【发布时间】:2012-01-22 09:13:15
【问题描述】:
我有兴趣用 C++ 编写一个用于 Mac OS X 的小实用程序来读取、解析、保存(覆盖)文件。我不需要任何 GUI、菜单或窗口。
- 在 XCode 中我需要从什么类型的项目模板开始?
- 如何访问传入的文件? (它通过 Apple Events
openFile传递,对吗?)
我做了一点 C++,但在 Mac 上什么也没有。链接赞赏,代码示例赞赏更多。
【问题讨论】:
我有兴趣用 C++ 编写一个用于 Mac OS X 的小实用程序来读取、解析、保存(覆盖)文件。我不需要任何 GUI、菜单或窗口。
openFile 传递,对吗?)我做了一点 C++,但在 Mac 上什么也没有。链接赞赏,代码示例赞赏更多。
【问题讨论】:
您打算如何将文件传递给您的应用程序?
如果是通过命令行,那么您将使用命令行工具模板并访问命令行参数,就像在任何 POSIX 平台(argc 和 argv)上一样。
如果您想使用 Finder 将文件传递给您的应用程序,例如,通过将文件拖放到应用程序图标上,那么您将使用 Cocoa 应用程序模板。
Info.plist 文件包含您的应用程序配置和支持的文档类型,类似于 Windows 上的注册表。
您可以通过项目设置的“信息”选项卡配置 Info.plist(它是 XCode 文件导航器中最顶层的文件)。单击右下角的“添加”按钮,然后选择“添加文档类型”以添加您的应用程序将接受的文档类型。要接受所有文档,请将文档名称设置为 All,并将扩展名设置为 *。 More info is here。
在 Info.plist 中添加一个 LSUIElement 键,并将其值设置为 YES 以指示您的应用程序没有 UI。该键在 XCode 中也显示为“Application is agent”。 More info on LSUIElement is here.
在 MainMenu.xib 中,您可以删除默认存在的 Window 和 Font Manager 对象,因为您不需要它们。
将 AppDelegate.m 文件重命名为 AppDelegate.mm,以便将其编译为 Objective-C++。这将允许您在该文件中使用 C++ 代码。
在 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 中的应用程序图标上,此代码就会运行。
【讨论】:
1) 使用命令行工具模板。此模板有几个选项。您可以从菜单中选择 C++。
2) 据我所知,IOstream 可以正常工作。另外,你的 main() 函数上有一个参数参数,你可以从这些 args 中获取文件名。
【讨论】: