Arbeiten mit dem Adobe XMP SDK



  • Hallo,
    ich arbeite an einem C++ Programm das mittels Adobe XMP SDK, Metadaten von einem Bild liest oder schreibt. Funktioniert soweit auch alles wunderbar auch weil es relativ ausführliche Docs zu dem Thema gibt.

    Jetzt zu meinem Problem, compile ich den Code und lasse ihn laufen funktioniert alles. Drücke ich die compilierte Exe doppelt funktioniert ebenfalls alles. Wenn ich allerdings eine Bat erstelle die diese Exe aufruft bekomm ich die Nachricht:"Unable to open bild.jpg". 😞

    Ich hänge hier mal den stark gekürzten Code an, der eigentlich nur versucht ein Bild zu öffnen:

    //Provide the string class with wich to instantiate the template classes
    #include <string>
    #define TXMP_STRING_TYPE std::string
    
    //Include the XMPFiles component of the XMP Toolkit
    #define XMP_INCLUDE_XMPFILES 1
    
    //Ensure that the XMP class templates are instantiated
    #include "XMP.incl_cpp"
    
    //Provide access to the XMP API
    #include "XMP.hpp"
    
    //Other includes
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main (void) {
    
    	string filename = "bild.jpg";
    
    	if(!SXMPMeta::Initialize())
    	{
    		cout << "Could not initialize toolkit!";
    		return -1;
    	}
    
    	// Must initialize SXMPFiles before we use it
    	if(SXMPFiles::Initialize())
    	{
    		try
    		{
    			// Options to open the file with - open for editing and use a smart handler
    			XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;
    
    			bool ok;
    			SXMPFiles myFile;
    			std::string status = "";
    
    			// First we try and open the file
    			ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts);
    
    			// If the file is open then read get the XMP data
    			if(ok)
    			{
    				cout << status << endl;
    				cout << filename << " is opened successfully" << endl;
    				myFile.CloseFile();
    			}
    			else
    			{
    				cout << "Unable to open " << filename << endl;
    			}
    		}
    		catch(XMP_Error & e)
    		{
    			cout << "ERROR: " << e.GetErrMsg() << endl;
    		}
    
    		// Terminate the toolkit
    		SXMPFiles::Terminate();
    		SXMPMeta::Terminate();
    
    	}
    	else
    	{
    		cout << "Could not initialize SXMPFiles.";
    		return -1;
    	}
    	cin.get();
    	return 0;
    }
    

    und hier mal die Bat:

    C:\\Debug\\Xmp4mSystem.exe
    PAUSE
    

    Ich hoffe ja, dass mir bei der Batch - Datei einfach nur ein nötiger Parameter fehlt? 😃

    Vielen Dank für die Hilfe
    geneticZ



  • Startest du das Programm mit einem doppelklick, so ist das aktuelle Verzeichnis das Verzeichnis, in dem das Programm liegt. Startest du die BAT-Datei, so ist das aktuelle Verzeichnis, das Verzeichnis der BAT-Datei.

    Das bedeutet, du öffnest die Datei "C:\Irgend\was\anderes\bild.jpg", statt "C:\Debug\bild.jpg".

    Du kannst das lösen, indem du in die BAT-Datei noch folgende Zeilen einfügst.

    C:
    cd \Debug\
    Xmp4mSystem.exe
    pause
    


  • Ich bin begeistert! Es geht! 🙂 👍
    Vielen Dank schonmal...

    Das führt mich allerdings zu meiner nächsten Frage, die jetzt nicht so unmittelbar mit C++ zu tun hat, vielleicht wird sie mir aber trotzdem beantwortet...

    Es gibt die möglichkeit mit Photoshop Javascript Dateien auszuführen, das ganze nennt sich dann PS-Script. Möchte ich mein XMP-Programm dann via Photoshop öffnen kann ich dieses Script hier verwenden:

    var bat = new File( $.getenv("public") + "/xmp.bat"); 
      bat.open("w"); 
      bat.writeln("C:");
      bat.writeln("cd \\Debug\\");
      bat.writeln("Xmp4mSystem.exe ");
      bat.writeln("pause");
      bat.close(); 
      bat.execute();
    

    Damit schreibe ich die Batch-Datei in einen nicht schreibgeschützen Ordner und führe sie dann aus, welche wiederrum mein C++ Programm ausführt! Das funktioniert! (Achtung nur mit PS-Script getestet)

    Es gibt aber auch die Möglichkeit direkt die Exe via PS-Script aufzurufen:

    var xmp= new File("/c/Debug/Xmp4mSystem.exe"); 
    xmp.execute();
    

    Da bekomme ich aber leider dann wieder die Meldung dass das Bild nicht geöffnet werden kann! Ist das das selbe Problem dass ich auch mit der Bat davor hatte? Oder liegt das an was anderem?

    Ich weiss dass die Frage hier nicht wirklich ins Forum passt, aber sie hängt halt gleich unmittelbar mit der oberen zusammen. 🙄

    Vielen Dank für die Hilfe
    geneticZ



  • Das ist exakt das gleiche Problem. Die Datei wird im aktuellen Verzeichnis geöffnet. Also entweder wechselst du das aktuelle Verzeichnis (so dass das aktuelle Verzeichnis das Bild enthält) vor dem Start des Programms, oder du trägst den vollständigen Pfad zu deinem Bild in dein C++-Programm ein.



  • Ja, du hast recht. Ich hab jetzt im Code den kompletten Pfad zum Bild verwendet.
    Jetzt funktioniert alles!
    Danke!


Log in to reply