您打算如何将文件传递到您的应用程序?
如果是通过命令行,那么您将使用命令行工具模板并访问命令行参数,就像在任何 POSIX 平台(argc和argv)上一样。
如果您想使用 Finder 将文件传递到应用程序,例如将文件拖放到应用程序图标上,那么您可以使用 Cocoa 应用程序模板。
Info.plist 文件包含您的应用程序配置和支持的文档类型,类似于 Windows 上的注册表。
您可以通过项目设置的“信息”选项卡配置 Info.plist(它是 XCode 中文件导航器中最顶层的文件)。单击右下角的“添加”按钮,然后选择“添加文档类型”以添加您的应用程序将接受的文档类型。要接受所有文档,请将文档名称设置为All并将扩展名设置为*。 更多信息请参见此处。
LSUIElement在 Info.plist 中添加一个键,并将其值设置为YES来指示您的应用程序没有 UI。该键在 XCode 中也显示为“Application is agent”。 有关 LSUIElement 的更多信息请参见此处。
在 MainMenu.xib 中,您可以删除默认情况下存在的窗口和字体管理器对象,因为您不需要它们。
将 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;
}
Run Code Online (Sandbox Code Playgroud)
就是这样。剩下的就是你的 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;
}
Run Code Online (Sandbox Code Playgroud)
每当您将文档拖放到 Finder 中的应用程序图标上时,都会运行此代码。