我有一个C++程序,应该从argv
中获取文件名,打开此文件并与其一起工作。
程序运行得非常好,因为:当我从终端调用二进制文件(Unix可执行文件
)时,程序会从argv
中获取名称并与其一起工作,但是当我从此二进制文件制作MacOS程序.app
时,然后双击要打开的文件,程序会抛出此错误:
再次说明,如果我启动已经在.app
目录中的二进制文件,一切正常,但是如果我从终端运行程序.app
,程序将再次抛出此错误。
我测试过的终端命令列表:
open -a /Applications/Sengine.app obj/rogers.mdl
- 没有工作
/Applications/Sengine.app/Contents/MacOS/SENGINE obj/rogers.mdl
- 工作正常
cmake-build-debug/SENGINE obj/rogers.mdl
- 工作正常
我使用cmake
编译程序:
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build cmake-build-debug --target SENGINE -- -j 3
以防万一,这是.app
程序的info.plist
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>Sengine</string>
<key>CFBundleExecutable</key>
<string>Sengine</string>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>CFBundleIdentifier</key>
<string>com.zolars.sengine-department.SENGINE</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Sengine</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>3.0.0</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<string>mdl.icns</string>
<key>LSItemContentTypes</key>
<array>
<string>mdl</string>
</array>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
</dict>
</plist>
如果我理解正确,双击文件后,文件名无法传递到源二进制文件。我无法弄清楚原因,也不知道如何修复。
请帮助我解决这个问题。
(void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
)还是这个?(以编程方式更改打开文件类型的默认应用程序) - starball