2011-12-16 56 views
4

我有興趣在C++中爲Mac OS X編寫一個小工具來讀取,解析,保存(覆蓋)寫入文件。我不需要任何GUI,菜單或窗口。如何訪問C++中的Apple事件「openFile」事件?

  1. 什麼類型的項目模板需要在XCode中開始?
  2. 如何訪問傳入的文件? (這是通過蘋果事件openFile,對吧?)

我已經做了一點C++,但沒有在Mac上。鏈接讚賞,代碼示例讚賞更多。

回答

1

你怎麼打算的文件傳遞給你的應用程序?

如果是通過命令行,那麼您將使用命令行工具模板並訪問命令行參數,就像您在任何POSIX平臺(argcargv)上一樣。

如果您想使用Finder將文件傳遞到您的應用程序,例如通過將文件放到應用程序圖標上,那麼您將使用Cocoa Application模板。

Info.plist文件包含您的應用程序配置和支持的文檔類型,類似於Windows上的註冊表。

  1. 您通過項目設置的「信息」選項卡配置的Info.plist(這是在Xcode中的文件導航中最頂層的文件)。點擊右下角的「添加」按鈕,然後選擇「添加文檔類型」以添加您的應用程序將接受的文檔類型。要接受所有文檔,請將文檔名稱設置爲All,並將擴展名設置爲*More info is here

  2. 在您的Info.plist中添加一個LSUIElement密鑰,並將其值設置爲YES以指示您的應用程序沒有UI。該密鑰在XCode中也顯示爲「應用程序是代理」。 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中的應用程序圖標上,就會運行此代碼。

+0

剛剛有機會回到這個!哇!看起來很棒!迫不及待地嘗試!第二部分正是我期待的!非常感謝! – 2011-12-25 06:57:58

1

1)使用命令行工具模板。這個模板有幾個選項。您可以從菜單中選擇C++。

2)據我所知,IOstream將工作得很好。另外,main()函數中有一個參數參數,您可以從這些參數中獲取文件名。

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

+0

IOstream是否可以通過Apple Events獲取文件名?它們不作爲標準命令參數傳遞。 – 2011-12-17 05:04:41