Hallo Apollonius,
zunächst mal danke für Deine Antwort. Aber ich muss gestehen, ich stehe mit
COM-Servern noch ziemlich am Anfang bzw. verwende ich die Dinger einfach nur ohne mir all zu viel Gedanken darüber zu machen.
D.h. Dein Stichwort
Single-Threaded Apartments geht wahrscheinlich schon in die Richtung. Der Hersteller des
COM-Servers sagt, dass intern ein Worker-Thread arbeitet der die Events auslöst, dass neue Daten da wären.
In der entsprechenden Klasse die von TOleServer abgeleitet ist, sehe ich nur folgendes bezüglich des Events:
Delphi-Quellcode:
procedure TMeineKlasse.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
1: if Assigned(FOnDataIn) then
FOnDataIn(Self, Params[0] {const IDispatch});
// hier natürlich noch weitere Fälle
end; {case DispID}
end;
Meine
Vermutung war jetzt die, das der
COM-Server intern die Nachricht in eine MessageLoop gibt und InvokeEvent darauf reagiert. Denn wenn InvokeEvent im Kontext des Threads laufen würde, hätte ich die Probleme nicht
Ich nutzte das Objekt wie folgt:
Delphi-Quellcode:
MeineKlasse := TMeineKlasse.Create(AOwner);
//...
MeineKlasse.OnDataIn := MeineKlasseDataIn;
//...
Reicht es tatsächlich so ein
CoInitializeEx mit
COINIT_MULTITHREADED aufzurufen? Nur woher weiß der TOleServer dann an welche MessageLoop er senden soll. Ich will einfach nur sicher gehen, dass der Mainthread für ein Paar Sekunden voll ausgelastet sein kann aber die Daten übertragen Device->Software weiter läuft.
THX, Chris