繁体   English   中英

MacOS.app 无法通过双击打开文件

[英]MacOS .app can't open file by double click

我有一个 c++ 程序,它应该从argv获取文件名,打开这个文件,然后使用它。

程序运行良好,因为:当我从终端调用二进制( Unix Executable )时,程序从argv获取名称并使用它,但是当我从这个二进制 MacOs 程序.app制作时,然后,通过双击文件,应该打开哪个程序,程序会抛出此错误:

打开 .mdl 文件时出现 Sengine 错误

同样,如果我启动二进制文件(已经在.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM