AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

COM Events und Threads - Problem

Ein Thema von bierwart · begonnen am 22. Mär 2008 · letzter Beitrag vom 24. Mär 2008
Antwort Antwort
bierwart

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

Re: COM Events und Threads - Problem

  Alt 24. Mär 2008, 14:12
O.K.,
habe ich verstanden, jedoch

a) Wie bekomme ich die Instanz des Interface Zeigers im Primär Thread ?
b) Wie jedoch bekomme ich dann den Schritt vom "korrektem Interfacezeiger" zum Zünden des Events in diesem
Kontext hin ? Zur Zeit wird das Event durch Verknüpfung mit einem Formular Event gezündet.

Habe mal probiert meine "Button-Methode" entsprechend umzuschreiben um mein Problem aufzuzeigen
(obwohl diese ja nur im Primär Thread läuft )

Delphi-Quellcode:
procedure TForm1.btnNavtestClick(Sender: TObject);
var XMLDoc : IXMLDocument;
    XMLDoc_RESP : IXMLDocument;
    SizeOfIncoimingStream : Integer;
    sFileName : string;
    sFilePath : string;
    sFilePathName : string;
begin

  RequestType := 'FLATFILE';
  sWorkingDirectory := Ini.GetWorkingPath;
  sFileCreationDate := FormatDateTime('ddmmyyyy',date)+FormatDateTime('hhnnss',now)+'_';
  XMLDoc := CreateXMLDoc;

  sFilePathName := Ini.GetIniFilePathName;
  sFileName := ExtractFilename(sFilePathName);
  CopyFileTo(sFilePathName,(sWorkingDirectory+sFileCreationDate+sFileName));

  Ini.GetXMLFile((sFileCreationDate+sFileName),XMLDoc,RequestType);
  XMLDoc.Save(sWorkingDirectory+sFileCreationDate+sFilename +'.XML');
  XMLDoc.load(sWorkingDirectory+sFileCreationDate+sFilename +'.XML');

  // Aktualisierung der Übergabe XML mit Pfadangabe
  XMLManagement.AddWorkingDirToXML(XMLDoc,sWorkingDirectory);

  NAV_XMLOut := XMLDoc;


  // Verarbeitung in Navision ******************************
  //SendDataToNavision(XMLDoc,XMLDoc_RESP);

  // <-- Aufruf muss im Primär Thread erfolgen, z.B.Thread.create, Wie bekomme ich die Instanz von FOLEInterface ?
  OLECheck(CoMarshalInterThreadInterfaceinStream(IOLEInterface,FOLEInterface,ISTREAM(FStream)));

  // <-- Aufruf im Sekundär Thread, Zeiger anschliessend in FOLEInterface
  OLECheck(CoInitialize(nil));
  OLECheck(CoGetInterfaceandReleaseStream(ISTREAM(FStream),IOLEInterface,FOLEInterface));

  // --> Hier Zünden des Events Im Kontext von FOLEInterface nötig ???
  

  CoUnInitialize;
  // **************************************************

end;

Zur Zeit erfolgt der Aufruf des Events über ein Event des Formulars. Was ich ja benötigen würde
wäre wohl die "AutoFactory.EventIID" ??

Delphi-Quellcode:
procedure TOLEInterface.Initialize;
begin
  inherited Initialize;
  FConnectionPoints := TConnectionPoints.Create(Self);
  if AutoFactory.EventTypeInfo <> nil then
    FConnectionPoints.CreateConnectionPoint(
      AutoFactory.EventIID, ckMulti, EventConnect);
  Form1.NewDataAvailable := self.Ev_NewXMLData_All; //Event verknüpfen
end;

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(self);
  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);
        (aSink as IOLEInterfaceEvents).NewXMLData(OLEOutVariant);
    end;
  end;
end;

function TOLEInterface.GetConnectionEnumerator(FOLEInterface : IOLEInterface) : IEnumConnections;
var
  aCPC : IConnectionPointContainer;
  aCP : IConnectionPoint;
begin
  Result := nil;
  OLECheck(FOLEInterface.QueryInterface(ICOnnectionPointContainer,aCPC));
  OLECheck(aCPC.FindConnectionPoint(AutoFactory.EventIID,aCP)); //<----- !!
  aCP.EnumConnections(Result);
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz