在Mac OSX上打開的對話我有一個包含代碼啓動從C++
#ifndef PLATFORM_DEPENDENCE
#define PLATFORM_DEPENDENCE
#define USE_MAC
#include "WindowsFunctions.h"
#include "MacFunctions.h
#endif
WindowsFunctions.h頭文件:
#ifndef WINTRANSFERINCLUDE
#define WINTRANSFERINCLUDE
#ifdef USE_WINDOWS
#include <string>
#include <boost/shared_ptr.hpp>
using namespace std;
#include <windows.h>
#include <Shlobj.h>
boost::shared_ptr<wstring> browseFolder();
boost::shared_ptr<vector<wstring>> getFilesInDirRecursiveImplementation(boost::shared_ptr<vector<wstring>> dirs, boost::shared_ptr<vector<wstring>> files);
#endif
#endif
和MacFunctions.h:
#ifndef MACTRANSFERINCLUDE
#define WACTRANSFERINCLUDE
#ifdef USE_MAC
#include <string>
#include <boost/shared_ptr.hpp>
using namespace std;
boost::shared_ptr<wstring> browseFolder();
boost::shared_ptr<vector<wstring>> getFilesInDirRecursiveImplementation(boost::shared_ptr<vector<wstring>> dirs, boost::shared_ptr<vector<wstring>> files);
#endif
#endif
WindowsFunctions.cpp已經實現,並且可以工作。我將如何爲Mac做到這一點?我寫了一個打開對話框的方法,但我不知道如何將數據返回到它在C++中調用的位置。
這是打開的對話框代碼:
#import <Cocoa/Cocoa.h>
#include <string>
std::string* path() {
NSOpenPanel *op = [NSOpenPanel openPanel];
if ([op runModal] == NSOKButton) {
NSURL *nsurl = [[op URLs] objectAtIndex:0];
// nsurl.path contains the NSString I want to return as std::string
}
// ???
return something;
}
我將如何做到這一點,還是我在一個錯誤的方式接近問題?
這不會編譯。 NSURL沒有UTF8String方法。另外,他上面的API使用wstring,而不是字符串,所以你需要導出爲UTF16,而不是UTF8。(它最初說[[nsurl absoluteURL] UTF8String]) – uliwitness
@uliwitness:答案已更新,但所提供的函數使用std :: string,以覆蓋其他注意事項。 –
這實際上很整潔! – DonAlonzo