我有一个c++程序,它应该从argv
获取文件名,打开这个文件,并使用它。
程序运行得非常好,因为:当我从终端调用二进制(Unix Executable
)时,程序从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>
如果我理解正确的话,由于某种原因,双击后,文件名不能到达源二进制文件。我不知道为什么,以及如何修复它。
请帮我拿这个。
1条答案
按热度按时间irlmq6kh1#
当您运行命令行程序时,它的工作方式与所有命令行程序一样,即阅读argv/argc。但是,当您将它与PLIST捆绑到.app目录中时,您是在指示它使用Launch Services和Info.plist文件。
通过这样做,您可以更改它打开文件的方式。使用Launch Services,您可以让应用程序保持运行,并在不重新启动的情况下继续传递新文件。在您的问题中,您有一个如何完成此操作的示例:
要实现这一点,应用程序需要处理application(_:openFiles:)方法。如果不将此功能添加到您的应用程序中,您将需要一些提供openFiles并通过
system()
或类似方法执行您的应用程序的中间启动器。