Announcement

Collapse
No announcement yet.

Was fehlt??

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

  • Was fehlt??

    Ich möchte ein COm Objekt erstellen, und IDispatch verwenden.
    Wenn ich Kompiliere, dann bekomme ich immer die Fehlermeldung:
    undeclared identifier: 'GetTypeInfoCount'
    undeclared identifier: 'GetType Info'
    undeclared identifier: 'GetHDSOfNames'
    undeclared identifier: 'Invoke'

    Kann mir da jemand weiterhelfen?

  • #2
    Hallo,

    alle diese Funktionen sind vordefinierte Interface-Methoden von <i>IDispatch</i>, so dass diese Fehlermeldung theoretisch gar nicht kommen dürfte, solange die notwendigen Units eingebunden werden. Außerdem ist es nur in den seltensten Fällen notwendig, die IDispatch-Methoden selbst zu implementieren. Die VCL erledigt dies im Hintergrund automatisch, wenn die passende Elternklasse (TAutoObject etc.) verwendet wird.

    Delphi stellt eigene Experten zur Verfügung, die das Grundgerüst für COM-Objekte zusammenbauen und dabei auch alle notwendigen Units und Elternteile einbinden. Ich würde daher zuerst diesen Weg einschlagen, anstelle alles von Hand zu schreiben

    Comment


    • #3
      >solange die notwendigen Units eingebunden werden
      Welche Units sind das?

      Das Problem ist, dass ich eben nichts von Hand eingtragen habe. Wenn ich im Delphi Experten in den Optionen der Schnittstelle den Wert der Übergebenen Schnittstelle auf IDispatch einstelle treten die genannten Probleme auf

      Comment


      • #4
        Hallo,

        wenn in Delphi über Datei | Neu aus der <b>Objektgalerie</b> der Experte für das <b>Automatisierungsobjekt</b> aufgerufen wird, legt dieser das Grundgerüst ohne eigenes Zutun an:
        <pre>
        unit Unit2;

        interface

        uses
        ComObj, ActiveX, Project1_TLB, StdVcl;

        type
        TTestClass = class(TAutoObject, ITestClass)
        protected
        { Protected-Deklarationen }
        end;

        implementation

        uses ComServ;

        initialization
        TAutoObjectFactory.Create(ComServer, TTestClass, Class_TestClass,
        ciMultiInstance, tmApartment);
        end.
        </pre>
        Und da das eigene Objekt von <b>TAutoObject</b> abstammt, erbt es die Interface-Methoden sowohl von IUnknown als auch von IDispatch.

        Ich gehe davon aus, dass anstelle von "Übergebenen Schnittstelle " der Eintrag <b>Übergeordnete Schnittstelle</b> im Typbibliothekseditor gemeint ist. Diese Auswahl definiert nur das Interface, das als Elternteil des abgeleiteten Interfaces verwendet werden soll. Allerdings muss man hier nichts mehr konfigurieren, da der Experte für Automatisierungsobjekte dies automatisch macht.

        Welche Arbeitsschritte werden konkret in welcher Reihenfolge ausgeführt

        Comment


        • #5
          1. Datei -> Neu -> Active X -> Active X Bibliothek
          2. Datei -> Neu -> Active X -> COM Objekt
          Im Fenster der Einstellungen ser Projekt1.tlb gehe ich auf die Schnittstelle (rotes Symbol)., und wähle als "überg. Schnittstelle" "IDispatch" aus.
          Das ganze unter Delphi 5
          Ich tue dies, weil ich ein COM-Objekt erstellen möchte, auf das ich von ASP(Javascript) zugreifen möchte. Oder beschreite ich hier den falschen weg? Ich habe in Ihrem Buch (Seite 39/40) gelesen, dass IUnknown dafür nicht ausreichend ist. Das COM Objekt soll nur eine Berechnung durchführen, und das Ergebnis zurückgeben.

          Danke für die bisherige Hilfe

          Comment


          • #6
            Hallo,

            aha - also da liegt der Hase im Pfeffer. COM unterscheidet penibel zwischen 3 Interface-Arten: <br>
            1. VTABLE-Interface <br>
            2. DispInterface (IDispatch) <br>
            3. Dual Interface<br>
            Den Experten für ein COM-Objekt ruft man immer dann auf, wenn nur ein VTABLE-Interface benötigt wird, aber keine IDispatch-Unterstützung. Immer dann, wenn IDispatch benötigt wird, bedeutet dies bei Delphi (im Gegensatz zu C++) automatisch, dass ein Automation-Server zusammengebaut werden muss. Delphi greift (im Gegensatz zu C++) immer auf den Typbibliothek-Marshaler als Standard-Marshaler zurück, zu dass in diesem Fall ein Automation-kompatibles Dual Interface vom Experten zusammengebaut wird.

            Somit gibt es 2 Lösungen für das Problem: <br>
            1. COM-Objekt verzichtet auf IDispatch und nutzt nur das VTABLE-Interface <br>
            2. Anstelle von COM-Objekt wird der Experte für ein Automatisierungs-Objekt aufrufen.

            Allerdings ist die Lösung 1 für ASP unsichtbar, so dass nur die Lösung 2 in einer ASP angesprochen werden kann. Allerdings gibt es bei ASP-Objekten einen Sonderfall, so dass Delphi 5 Enterprise einen eigenen Experten für ein <b>Active Server Objekt</b> hat. Ein Beispielprojekt habe ich gestern im Download-Bereich des Delphi-FORUMS abgelegt. Dort werden auch die Handgriffe beschrieben, die notwendig sind, wenn nur Delphi 5 Professional zur Verfügung steht

            Comment

            Working...
            X