Hallo,
ich habe folgende Applikation erstellt:
COM Server als Exe mit der Unterstützung von Events. (Automatisierungsobjekt)
Der Server soll als
TCP/
IP Server fungieren. Daten werden empfangen und sollen
anschliessend über das SinkObject an einen Client (Hier: Navision) übergeben werden.
Dort werden die Daten verarbeitet und ein Ergebnis zurückgeliefert.
Der Server ist als "Singleton-Server" ausgeführt.
Auf dem Serverformular wurde ein Button erstellt, der zu Testzwecken das Event "zündet".
Dies funktioniert einwandfrei. Die Daten werden übergeben und es wird auch gewartet, bis die
Funktion im Client abgearbeitet wurde und ein Rückgabewert existiert.
Problem:
Beim Aufruf über die "Execute" Funktion der TCPServer Komponente (
Indy 9) läuft alles
vermeintlich korrekt, jedoch wird das Event im Client nicht gezündet.
Nachdem ich nun probiert habe expliziert über alle Clients zu iterieren, bekomme
ich zumindest die Fehlermeldung: "EInftCastError - Schnittstelle wird nicht unterstützt".
Meine Vermutung ist, dass das Problem der eigene Thread ist, indem die Execute Methode der
Indy Komponente
ausgeführt wird.
(Habe leider auch in der Bibel "
COM/
DCOM/
COM+" hier nichts passendes gefunden).
Wie kann ich eine threadübergreifende korrekte Verwednung der Sink-Objekte erreichen ?
Delphi-Quellcode:
procedure TOLEInterface.Ev_NewXMLData_All(Sender : TObject);
var
aEnum : IEnumConnections;
aCData : TConnectData;
aSink : IUnknown;
iFetch : Cardinal;
OLEInVariant : OLEVariant;
OLEOutVariant : OLEVariant;
XMLOut : IXMLDocument;
XMLIn : IXMLDocument;
XMLOutStream : TMemoryStream;
begin
aEnum := GetConnectionEnumerator;
If aEnum <> Nil Then begin
XMLOutStream := TMemoryStream.Create;
Form1.GetXMLOut(XMLOut);
XMLOut.SaveToStream(XMLOutStream,ofNone);
XMLOutStream.Position := 0;
OLEOutVariant := StreamToOleVariant(XMLOutStream, XMLOutStream.Size);
while aEnum.Next(1,aCData,@iFetch) = S_OK do begin
aSink := aCData.pUnk;
If Assigned(aSink) Then
(aSink as IOLEInterfaceEvents).NewXMLData(OLEOutVariant,OLEInVariant);
end;
end;
end;
An der Stelle
"(aSink as IOLEInterfaceEvents).NewXMLData(OLEOutVariant,OLEI nVariant);"
kommt es zu besagter Fehlermeldung.
Wie bereits erwähnt, beim Aufruf über einen Formularbutton funktioniert
die ganze Sache. Bin hier ziemlich ratlos !