Einzelnen Beitrag anzeigen

bierwart

Registriert seit: 15. Okt 2006
Ort: Geldern
3 Beiträge
 
Delphi 7 Professional
 
#1

COM Events und Threads - Problem

  Alt 22. Mär 2008, 10:20
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 !
  Mit Zitat antworten Zitat