Announcement

Collapse
No announcement yet.

ActiveX-Typbibliothek Typ Record als In/Out für Methoden/Funktionen

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

  • ActiveX-Typbibliothek Typ Record als In/Out für Methoden/Funktionen

    Ist es möglich den Typ Record über Methoden/Funktionen in einem ActiveX zurückgeben zu lassen. Bekomme TGUID generiert, obwohl Record vorgeben wurde. Weiteres Einbinden/Verwenden ist leider nicht "hilfreich" dokumentiert. Benutze Delphi5.

  • #2
    Hallo,

    ja - dieser Weg steht zur Verfügung, wie das folgende Beispiel aus meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> demonstriert:
    <pre>
    // ************************************************** *******************//
    // Deklaration von Strukturen, Unions und Aliasen.
    // ************************************************** *******************//
    TSrvRec = packed record
    Name: WideString;
    KontoNr: Integer;
    BLZ: Integer;
    end;

    // ************************************************** *******************//
    // Schnittstelle: IUDFSrvObj
    // Flags: (4416) Dual OleAutomation Dispatchable
    // GUID: {56D4F062-F5B3-11D3-BF78-005004303872}
    // ************************************************** *******************//
    IUDFSrvObj = interface(IDispatch)
    ['{56D4F062-F5B3-11D3-BF78-005004303872}']
    function Get_Info: WideString; safecall;
    function Get_Kunde: OleVariant; safecall;
    procedure SetKunde(aKunde: TGUID); safecall;
    property Info: WideString read Get_Info;
    property Kunde: OleVariant read Get_Kunde;
    end;
    </pre>
    Die Typbibliothek deklariert eine Struktur (Record), die als Parameter in einer Interface-Methode genutzt wird.

    Delphi vergibt zwar im Typbibliothekteditor eine GUID für die eigene Record-Struktur, allerdings wird diese GUID in der generierten _TLP.pas nicht als Konstante deklariert. Daher muss dieser Schritt im Implementationsteil des COM-Servers nachgeholt werden:
    <pre>
    implementation

    uses
    ComServ, OsUDFExt;

    const
    // GUID für Record aus dem TLB-Editor hierher kopieren
    IID_SrvRec : TGUID = '{56D4F066-F5B3-11D3-BF78-005004303872}';
    </pre>
    Der COM-Server darf allerdings nun mehr kein Dual-Interface verwenden, daher wird diese Option auf der Registerseite Flags in der TLB abgewählt. Der Grund für diese Einschränkung liegt in der Beschränkung des Dispatch-Interfaces, das von Delphi automatisch generierte zweite DispInterface verwendet auch beim UpdatePack von Delphi 5 den "falschen" Datentyp TGUID. Allerdings wird der richtige Datentyp in Kommentarklammern dahintergesetzt - und da nun beide Interfacedeklaration unterschiedlich sind, weigert sich Delphi, das Gebilde zu compilieren. Um dieses Problem zu lösen, wird auf die späte Bindung verzichtet - so das der COM-Server nur noch ein Interface unterstützt.

    Der COM-Server (ActiveX) kann nun einen Interface-Zeiger für <i>IRecordInfo</i> abfordern, um die als Record verpackte Daten korrekt identifizieren zu können:
    <pre>
    vRecordInfo := GetStructRecordInfo(IID_SrvRec, LIBID_UDFSrv);
    </pre&gt

    Comment

    Working...
    X