4

I have a c++ program, which should get the file name from argv, open this file, and work with it.

Program works perfectly well, because: when I call binary (Unix Executable) from the terminal, program gets th name from argv and works with it, but when I made from this binary MacOs program .app, then, by double clicking on file, which program should open, program throws this error:

Sengine Error while opening .mdl files

And again, if I launch binary (which already in .app directory), everything works, but if i run programm .app from terminal, program will throw this error again

list of terminal commands, that I tested:

open -a /Applications/Sengine.app obj/rogers.mdl - didn't work

/Applications/Sengine.app/Contents/MacOS/SENGINE obj/rogers.mdl - did work

cmake-build-debug/SENGINE obj/rogers.mdl - did work

I'm compiling program with cmake:

/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build cmake-build-debug --target SENGINE -- -j 3

File info.plist from .app program, just in case:

<?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>

If I understood rightly, for some reason name of the file, after double clicking, doesn't reach source binary. I can't figure out why, and how to fix it.

Help me please with this.

zolars
  • 79
  • 6
  • Does [this](https://stackoverflow.com/questions/19166716) help? (implement `(void)application:(NSApplication *)sender openFiles:(NSArray *)filenames`) Or [this](https://apple.stackexchange.com/questions/9866)? (programmatically changing default app to open file type) – starball Aug 26 '22 at 19:31

1 Answers1

3

When you run a command line program it works as all command line programs, by reading argv/argc. But when you bundle it into a .app directory with a PLIST you are instructing it to use Launch Services and the Info.plist file.

By doing, so you change how it opens files. Using Launch Services, you can leave the application running and continue to hand it over new files without restarting. You had an example of how that is done in your question:

open -a /Applications/Sengine.app obj/rogers.mdl

To accomplish this, the application will need to handle the application(_:openFiles:) method. Without adding this functionality to your application you would need some intermediate launcher that provides openFiles and executes your application via system() or similar.

James Risner
  • 5,451
  • 11
  • 25
  • 47