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.
Announcement
Collapse
No announcement yet.
ActiveX-Typbibliothek Typ Record als In/Out für Methoden/Funktionen
Collapse
X
-
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>
Comment