[英]MacOS .app can't open file by double click
我有一个 c++ 程序,它应该从argv
获取文件名,打开这个文件,然后使用它。
程序运行良好,因为:当我从终端调用二进制( Unix Executable
)时,程序从argv
获取名称并使用它,但是当我从这个二进制 MacOs 程序.app
制作时,然后,通过双击文件,应该打开哪个程序,程序会抛出此错误:
同样,如果我启动二进制文件(已经在.app
目录中),一切正常,但如果我从终端运行 programm .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>
如果我理解正确,由于某种原因文件的名称,双击后,不会到达源二进制文件。 我不知道为什么,以及如何解决它。
请帮我解决这个问题。
当您运行命令行程序时,它通过读取 argv/argc 来作为所有命令行程序运行。 但是,当您将它与 PLIST 捆绑到 a.app 目录中时,您将指示它使用 Launch Services 和 Info.plist 文件。
通过这样做,您可以更改新文件的外观。 使用启动服务,您可以让应用程序继续运行并继续将其移交给新文件,而无需重新启动。 你有一个例子说明你的问题是如何做到的:
open -a /Applications/Sengine.app obj/rogers.mdl
为此,应用程序需要处理application(_:openFiles:)方法。 如果不将此功能添加到您的应用程序,您将需要一些提供 openFiles 并通过system()
或类似方法执行您的应用程序的中间启动器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.