Announcement

Collapse
No announcement yet.

Ocx in einer DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ocx in einer DLL

    Hallo;<br>
    <br>
    das Problem beschreibt sich wie folgt:<br>
    <br>
    Multi- Threading- System, Datenaustausch sowie Methoden aufrufe erfolgen <br>
    über: PostThreadMessage, Parameter sind die Thread ID des MessageThread<br>
    die MessageID und ein Pointer auf die Daten(wParam).<br>
    Datenaustausch und InterProcesskomunikation erfolgen einzig und allein <br>
    über das PostThreadMessage. Gut.<br>
    Eine Modul DLL enthält eine Ocx-Componente die auf einem Formular<br>
    ist. Dynamisches erstellen und ansprechen der Methoden funktioniert.<br>
    jedoch! werden die Signale der Komponente an meinen Messagethread gesendet,<br>
    ergo empfängt die komponente nicht Signale auf die ich dort warte.<br>
    Ich habe heraus gefunden, dass wenn ich die komponente anders aufrufe beim erstellen<br>
    funktioniert alles wunderbar.<br>
    Nun mal ein PseudoCode Beispiel um das ganze zu veranschaulichen:<br>

    AA Ablauf so das nur Methoden aufrufe Funktionieren<br>
    (also eigentlich der Falsche )<br>
    zu erst:<br>
    ProgStart<br>
    MessageThreadID=Init(MessageThread);//ist ein Thread-Object mehr dazu später<br>
    Ende ProgStart<br>
    <br>
    dann passiert:<br>
    Useraktion//Bewirkt die Initialisierung des Forms mit OCX drauf )<br>
    Erstelle DatenPaket(DP_Pointer);<br>
    PostThreadMessage(MessageThreadID,MSGId,DP_Pointer ,0);<br>
    ende UserAktion<br>
    <br>
    darauf folgt:<br>
    MessageThread//Execute Methode<br>
    FnkCall:ProcedurePointer;<br>
    while not(terminated)<br>
    if GetMessage(mMSG,0,0,0) then<br>
    begin<br>
    FnkCall:=selectEmpfägerBy_MSGId(mMSG);<br>
    if Assigned() then<br>
    FnkCall(mMsg);<br>
    end;<br>
    end;<br>
    end MessageThread<br>
    <br>
    Dann erfolgt:<br>
    MessageVerArbeiter<br>
    mMsgID:=extractMSGId(mMSG);<br>
    Daten:=extractData(mMSG);<br>
    case mMSGID of<br>
    OCX_DLL_MTH: dllPerform(Daten);//Ruft eine Methode innerhalb der DLL <br>
    auf.<br>
    end;<br>
    ENDE MessageVerArbeiter<br>
    <br>
    Ist der Ablauf so wie beschrieben erreichen dem MessageThread alle<br>
    Events der OCX-Komponente.<br>
    <br>
    (EventProceduren wurde mit ObjectInspector zu geordnet)<br>
    <br>
    Wenn ich den Ablauf so belasse und nur den Block (USERAKTION)<br>
    wie folgt ändere:<br>
    Useraktion<br>
    Erstelle DatenPaket(DP_Pointer);<br>
    if OCX_DLL_MTH then<br>
    dllPerform. . .<br>
    else<br>
    PostThreadMessage(MessageThreadID,MSGId,DP_Pointer ,0);<br>
    ende UserAktion<br>
    <br>
    Und so geht es, die OCX Sendet mir keine events mehr zum MessageThread<br>
    sondert kümmert sich selbst um deren verarbeitung.(WM_Paint etc.)<br>
    Zu guter letzt erreichen mich auch die events auf die ich innerhalb der <br>
    Komponente Warte.<br>
    <br>
    //Kurz zur DLL<br>
    <br>
    InitCall<br>
    Create TForm mit dem OCX;<br>
    merken des TForms;<br>
    ende InitCall<br>
    <br>
    //Das TFORM<br>
    <br>
    :<br>
    :<br>
    TMainf=class(TForm)<br>
    IOCX:OCX_COMPO; <br>
    procedure MessageEgal;<br>
    public<br>
    :<br>
    privat<br>
    :<br>
    etc.<br>
    end;<br>
    implement<br>
    procedure MessageEgal<br>
    begin<br>
    ShowMessage;<br>
    end;<br>
    <br>
    <br>
    Wie gesagt alles Funktioniert prima, bis darauf das mein MessageThread <br>
    nach unverändertem ablauf nachrichten erhält mit denen er nix anfangen kann.<br>
    Bei manipulierten ablauf erhält sie der der damit auch umgehen kann,<br>
    keine ahnung wer das ist )<br>
    <br>
    Zu gegeben lässt sich das Problem sehr schwer beschreiben aber dennoch:<br>
    wäre ich für ansätze sehr dankbar.<br>
    Achso: Alles was die DLL zurückgeben darf sind nur Funktionsrückgabe- Werte
    (WORD)<br>
    <br>
    und Daten der abgefragten events.(keine Pointer auf TForms oder was auch <br>
    immer) da die dll autonom sein soll und jederzeit ersetzbar ohne Prog.- <br>
    Abläufe des Hauptprogrammes zu ändern.<br>
    so falls ich eine antwort vor morgen 8:00 uhr erhale info bitte an:<br>
    [email protected]<br>
    <br>
    Vielen DANK!<br>

  • #2
    Hallo,

    hinter einem OCX steckt ein COM-Objekt (Component Object Model) - und dieses wird wohl ein STA (Single-Threaded Apartment) anmelden. Das Betriebssystem setzt ein STA durch ein verstecktes Fenster und eine eigene Botschaftwarteschlange um. Die COM-Knigge legt bestimmte Regeln für ein STA fest, so dass das OCX gezwungen wird, regelmässig die Botschaftswarteschlange auszulesen, um eigene Aufrufe durch den Marshaler mitzubekommen. Immer dann, wenn man diesem Mechanismus in die Quere kommt, handelt man sich Probleme ein

    Comment


    • #3
      hey, guten morgen<br>
      <br>
      Naja, das Problem hat sich so zusagen erledigt,<br>
      ich ersetzte die OCX durch C++ API- Aufrufe.<br>
      Dennoch Danke

      Comment

      Working...
      X