Announcement

Collapse
No announcement yet.

Photoshop Scripting COM Schnittstelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Photoshop Scripting COM Schnittstelle

    Erstmal hallo an alle,
    ich habe mit VB.NET ein kleines Tool geschrieben, das auf die Photoshop COM Schnittstelle zugreift.
    Leider funktioniert diese Anwendung nur mit genau der Photoshop Version, für die auch unter Projekt - Eigenschaften - Verweise die entspr. Object Library (in meinem Fall Photoshop CS2: Adobe Photoshop 9.0 Object Library) referenziert wurde. Will jetzt jemand mit CS3 die Anwendung benutzen bekommt er einen Fehler.

    Lassen sich solche Verweise auch irgendwie dynamisch vornehmen, damit das Tool auch mit anderen Versionen funktioniert?

  • #2
    Hallo,

    ja es geht. COM kann dynamisch per Late-Binding erzeugt bzw. zugegriffen werden.

    Dies geht allerdings mit dem Nachteil einher dass auf die Eigenschaften und Methoden des Objekts nur mehr per Reflektion zugegriffen werden kann. D.h. der Zugriff ist ein bischen aufwändiger.

    Tipp:
    Anwendung zuerst mit "Early-Binding" (Referenz im Designer) erstellen dann die Referenz entfernen und den Code derart abändern dass die Objekte per Reflektion erzeugt/zugegriffen werden.

    Nachfolgendes Beispiel verdeutlicht dies beim Starten/Schließen von Excel.
    Code:
    # Imports System
    #
    # Namespace ConsoleApplication1
    #     Class Program
    #         Private Shared Sub Main(ByVal args As String())
    #             ' IDispatch Interface von Excel holen:
    #             Dim xlsAppType As Type = Type.GetTypeFromProgID("Excel.Application")
    #            
    #             ' Instanz von Excel erstellen:
    #             Dim xlsApp As Object = Activator.CreateInstance(xlsAppType)
    #            
    #             ' Excel sichtbar machen:
    #             xlsAppType.GetProperty("Visible").SetValue(xlsApp, True, Nothing)
    #            
    #             ' Excel schließen:
    #             xlsAppType.GetMethod("Quit").Invoke(xlsApp, Nothing)
    #         End Sub
    #     End Class
    # End Namespace
    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke für die Antwort. Sieht ja gar nicht schwer aus
      Weißt du evt. auch, wie die ProgID von Photoshop lautet?

      Comment


      • #4
        ProgID schon gefunden (Photoshop.Application).

        Das gestaltet sich für mich jetzt schwieriger als es auf den ersten Blick aussieht. Vielleicht weil ich normalerweise in C/C++ oder Java programmiere...

        Was mache ich denn mit Funktionen, die Objekte von dieser COM Schnittstelle als Argument bekommen?

        z.B. habe ich eine Funktion

        Private Sub analyzeLayerSet(ByRef layerSet As Photoshop.LayerSet)

        Wie sollte die mit "late-Binding" aussehen?

        Oder gibt es noch eine andere Möglichkeit, das evt. noch auf eine andere Art zu machen - evt. starr eben für CS3 zu kompilieren, obwohl CS3 nicht auf dem System installiert ist? Das wäre auch ok.

        Comment


        • #5
          Hallo,

          der Aufruf von Methoden, Lesen/Schreiben von Eigenschaften geht dann auch über Reflektion.

          zB (die Strings in GetProperty und GetMethod müsse durch die tatsächlichen ersetzt werden)
          Code:
          Dim photoShopType As Type = Type.GetTypeFromProgID("Photoshop.Application")
          Dim photoShop As Object = Activator.CreateInstance(photoShopType)
          
          ' Eigenschaft Layerset holen:
          Dim pi As PropertyInfo = photoShopType.GetProperty("LayerSet")
          Dim layerSet As Object = pi.GetValue(photoShop, Nothing)
          
          ' Methode analyzeLayerSet aufrufen. Argument layerSet:
          Dim mi As MethodInfo = photoShopType.GetMethod("analyzeLayerSet")
          mi.Invoke(photoShop, New Object() {layerSet})
          Ob es eine "starre" Möglichkeit gibt weiß ich nicht. Wird auf ein COM-Objekt in .net verwiesen so wird eine "Wrapper"-Klasse erstellt um in der .net-Anwendung daruf zugreifen zu können.
          Zur Entwicklung müssten auf deinem System demzufolge beide Versionen von Photoshop installiert sein.
          Ob es zur Laufzeit Probleme gibt wenn eine Version auf dem Zielrechner nicht vorhanden ist kann ich nicht beantworten.

          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            Moin!
            Habe einen "Trick" gefunden.
            Egal ob für CS2 oder CS3 programmiert - am Ende muss man nur die Photoshop.Interop.dll vom Release entsprechend austauschen, damit es mit den jeweiligen Versionen von Photoshop funktioniert.

            Comment


            • #7
              Hallo,

              heißt das das einmal für CS2 kompiliert wird und dann für CS3 um die beiden Interop-Dlls zu erhalten?

              Bitte um kurze Beschreibung wie die Vorgehensweise jetzt ist.

              Danke.

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Nene. Einmal mit CS2 kompiliert, einmal mit CS3 kompiliert und jeweils die Interop-Dll gespeichert.
                Je nach dem für welchen Photoshop das jetzt benutzt wird, wird einfach die passende dll mit ins Verzeichnis kopiert.
                Quick aber Dirty ;-)

                Comment


                • #9
                  Originally posted by gfoidl View Post
                  heißt das das einmal für CS2 kompiliert wird und dann für CS3 um die beiden Interop-Dlls zu erhalten?
                  meinte ich doch.
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment

                  Working...
                  X