Announcement

Collapse
No announcement yet.

Probleme mit TLBs und ActiveX

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

  • Probleme mit TLBs und ActiveX

    Hallo,

    ich möchte eine ActiveX-DLL erzeugen, die eine Klasse liefert, deren Methoden Parameter besitzt, die in einem anderen ActiveX deklariert sind. Sprich ich will eine ActiveX erzeugen, das als Plugin von einem anderen ActiveX-Server verwendet werden kann. In VisualBasic ist das absolut kein Hexenwerk, aber in Delphi7 will das ums verrecken nicht klappen.

    Ich habe eine TLB die die globalen Objekte liefert, die der ActiveX-Server zur Verfügung stellt. Darin ist zum Beispiel ein ILoginDispatch deklariert, daß ich als Typ für einen Parameter meines Plugins verwenden muss.

    Delphi erlaubt bei der Erstellung der TLB meines Plugins nicht diesen Typ, sondern nur irgendwelche Standardtypen.
    In VB sieht zum Beispiel eine Function OnLoad wie folgt aus (TLB definition nimmt mir Visual Studio komplett ab):
    Code:
    	Public Shadows Function OnLoad(ByRef lg As GlobalObject.Login) As Object //GlobalObject ist die Server-TLB, Login vom Typ 
    	  MsgBox("User " & lg.username & " started PlugIn ( OnLoad ).")         // ILoginDispatch
              OnLoad = True
    	End Function
    In Delphi hab ich versucht mir in der TLB mit IUnknown zu behelfen
    Code:
      IGMTComClass = interface(IDispatch)
        ['{F74B551E-7464-4427-8A8F-4899322FFFE1}']
        procedure DisplayMessage(const Text: WideString); safecall;
        function OnLoad(const lg: IUnknown): WordBool; safecall;
      end;
    In meiner Implementierung hab ich dann folgendes versucht:
    Code:
    uses GlobalObject_TLB
    .
    .
    function TGMTComClass.OnLoad(const lg: IUnknown): WordBool;
    begin
      MeinForm.Label1.Caption:= string((lg as login).username);
      Result:=True;
    end;
    Ist das grundsätzlich falsch?

    Viel wohler wäre mir, wenn ich in der TLB direkt auf ILoginDispatch als Paramter zugreifen könnte. Aber die TLB wehrt sich vehement gegen Änderungen, ich kann die uses-Klausel nicht erweitern, und demzufolge auch nicht die erforderliche Server-TLB einbinden. Das Ganze versuche ich jetzt schon immer wieder seit Wochen. Und langsam verzweifel ich an der Kiste. Warum geht das in VB so trivial einfach, aber in Delphi überhaupt nicht? :evil:

    Ich habe beim Ausführen im PluginServer dann schließlich das Ergebnis, daß sobald ich aus meinem Server das Plugin verwenden will, nach dem erfolgreichen Laden und initialisieren des Plugins die Meldung kommt, die Klasse wäre nicht registriert. Ich vermute der Server will die Methode OnLoad ausführen, aber da kracht es dann halt.

    Weiß hier jemand was dazu?

    Vielen Dank,
    Sherlock

  • #2
    Hallo!

    So geht's in Delphi 5 (ich hoffe das läßt sich auf die 7er übertragen)
    Im Editor der Typbibliothek das Projekt auswählen
    Rechts den Reiter Verwendet anwähöen
    Dort die Bibliothek mit dem Typ ILoginDispatch mit anwählen. In Delphi 5 muss man zuerst im Kontextmenü "Alle typblbiotheken anzeigen" auswählen.
    Danach kannst Du den Typ bei allen Parametern etc. verwenden

    BYE BERND

    Comment


    • #3
      Das ist zu einfach...

      Vielen Dank, das hat mein Problem gelöst.

      Jetzt muss ich nur noch verstehen, warum es zwar kompiliert und richtig aussieht, aber trotzdem noch nicht vom Server eingebunden wird.

      Sherlock

      Comment


      • #4
        Hallo!

        Das ist evtl. ebenso simpel:
        Wenn Du eine andere Typbibliothek in Dein neues ActiveX einbindest wird KEIN CODE eingebunden sondern lediglich die "Interfacebeschreibung".

        Auf dem Zielrechner(server) muss dieses "andere" ActiveX also installiert sein, sonst funktioniert Dein eigenes ActiveX nicht...

        BYE BERND

        Comment


        • #5
          Tja, der Server ist eine Exe, die nicht registriert ist. Kann das ein Problem darstellen?

          Ich hatte irgendwo mal gelesen (ich glaub bei Eric Harmon), daß die ActiveXe einer Exe registriert sind, so lange sie läuft.

          Edit: Ach, und nochwas: Die DLL wird vom Server gestartet, aber die Kommunikation zwischen Server und Plugin scheint nicht zu laufen.

          Gruß,
          Sherlock
          Zuletzt editiert von Sherlock; 10.05.2007, 10:39.

          Comment


          • #6
            Hallo!

            Die Exe registriert sich bei Ihrem ersten Start selbst.
            Trotzdem muss die "andere" ActiveX Komponente ebenfalls installiert sein.

            Bei uns gibt es eine COM Komponente, die eine neuere MDAC Version benötigt kein Problem bei 2003 Servern, bei 2000 Servern muss ich jedesmal das MDAC Update machen, bevor ich unsere Software installieren kann...

            Aber erzähl mal was Du da eigentlich machst...

            BYE BERND

            Comment


            • #7
              Oh weh, das ist eine lange Geschichte

              Im Prinzip geht es um die Integration der Delphi-Applikationen einer Tochtergesellschft in die C++-Applikation der Muttergesellschaft. Die Tochter-Apps sollen in einem Container als Plugins laufen.

              Die Muttergesellschaft hat die unangenehme Eigenart darauf zu bestehen, daß ActiveX-DLLs nicht auf dem Kundenrechner installiert werden dürfen. Das umgehen wir mittlerweile mit Manifestdateien (nur ab XP auswärts). Aber offenabr hat dies seltsame Nebenwirkungen auf die ActiveX-Kommnikation, wie Delphi es gewohnt ist.

              Sherlock

              Comment


              • #8
                Hallo!

                Das ist aber eine nette "Anforderung"

                Tja, wenn das tatsächlich ein grundsätzliches Problem von Delphi ist wie wäre es mit dem Umweg über COM.

                Auf dem "Mutter"Server ist das ActiveX ja installiert also dort eine COM Komponente, einrichten, die nur die Kommunikation mit den Clients ermöglicht.

                Inwiefern das Ganze dann noch threadsicher etc. ist muss ich leider passen.

                VIEL SPASS!!!

                BYE BERND

                Comment


                • #9
                  Danke, werde ich wohl haben

                  Sherlock

                  Comment

                  Working...
                  X