Announcement

Collapse
No announcement yet.

MDI-Fenster in COM-Objekt

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

  • MDI-Fenster in COM-Objekt

    Hallo,

    ich kämpfe mit einem merkwürdigen Phänomen. Mein selbstgemachter Editor ist eine MDI-Anwendung und läuft auch prima. Diesen wollte ich um ein COM-Interface erweitern, um von anderen Anwendungen z.b. Dateien zu öffnen.

    Das erste Problem besteht darin, daß sich zwar die EXE registrieren läßt (zumindest sagt das TREGSVR) aber wenn ich sie über COM anspreche meldet "Klasse nicht registriert". In der Registry ist auch kein Eintrag zu finden, weder dig GUID noch der Klassenname.

    Dann hab ich statt einer EXE eine DLL erzeugt. Registrieren klappt prima, Registryeintrag ist dann auch vorhanden, aber beim Versuch eine Datei zu laden (was ein MDI-Child erzeugt) kommt dann "Zur Zeit sind keine MDI-Formulare aktiv". Der FormStyle der Hauptform ist aber definitiv auf fsMDIForm gesetzt. Stutzig macht mich nur die Tatsache, daß das Fenstermenü, was ja nur aktiv ist wenn mindestens 1 MDI-Fenster existiert, aktiv ist. Bei der EXE ist das anfangs disabled.

    Woran könnte es liegten?

    Ciao

  • #2
    Hallo,

    nur In-Process-Server (DLLs, OCX, oder TLBs) werden über TRegSvr registriert. Ein Local Server (EXE) registriert sich bei jedem Start selbst, wenn man das Standardverhalten der Class Factories von Delphi nicht geändert hat.

    Falls Delphi 5 eingesetzt wird, sollte in der Projektdatei als erste Zeile <i>Application.Initialize;</i> stehen. Falls der Fehler dann immer noch auftritt, <b>wie</b> wurde das Automatisierungsobjekt nachträglich hinzugefügt

    Comment


    • #3
      Hallo Herr Kosch,

      ich füge mal die Sources ein. Sieht für mich alles prima aus.

      TextEditor_TLB:
      ===============
      unit texteditor_TLB;

      // ************************************************** ********************** //
      // WARNUNG
      // -------
      // Die in dieser Datei deklarierten Typen wurden aus Daten einer Typbibliothek
      // generiert. Wenn diese Typbibliothek explizit oder indirekt (über eine
      // andere Typbibliothek) reimportiert wird oder wenn die Anweisung
      // 'Aktualisieren' im Typbibliotheks-Editor während des Bearbeitens der
      // Typbibliothek aktiviert ist, wird der Inhalt dieser neu generiert und alle
      // manuell vorgenommenen Änderungen gehen verloren.
      // ************************************************** ********************** //

      // PASTLWTR : $Revision: 1.88.1.0.1.0 $
      // Datei generiert am 22.11.2000 08:23:47 aus der unten beschriebenen Typbibliothek.

      // ************************************************** ********************** //
      // Typbib: D:\Delphi5\su\Text\texteditor.tlb (1)
      // IID\LCID: {02DAF591-CC89-43CF-9458-76C317E69124}\0
      // Hilfedatei:
      // AbhLst:
      // (1) v2.0 stdole, (C:\WIN2000\System32\stdole2.tlb)
      // (2) v4.0 StdVCL, (C:\WIN2000\System32\STDVCL40.DLL)
      // ************************************************** ********************** //
      {$TYPEDADDRESS OFF} // Unit muss ohne typüberprüfte Zeiger compiliert werden.
      interface

      uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL;

      // ************************************************** *******************//
      // In dieser Typbibliothek deklarierte GUIDS . Es werden folgende
      // Präfixe verwendet:
      // Typbibliotheken : LIBID_xxxx
      // CoClasses : CLASS_xxxx
      // DISPInterfaces : DIID_xxxx
      // Non-DISP interfaces : IID_xxxx
      // ************************************************** *******************//
      const
      // Haupt- und Nebenversionen der Typbibliothek
      texteditorMajorVersion = 1;
      texteditorMinorVersion = 0;

      LIBID_texteditor: TGUID = '{02DAF591-CC89-43CF-9458-76C317E69124}';

      IID_ITextedit: TGUID = '{0D8D24A5-68A4-4F9A-B80C-5FBEF41AA208}';
      CLASS_Textedit: TGUID = '{A8EEAC00-84A7-4FBD-9153-A4F042F99B7D}';
      type

      // ************************************************** *******************//
      // Forward-Deklaration von in der Typbibliothek definierten Typen
      // ************************************************** *******************//
      ITextedit = interface;
      ITexteditDisp = dispinterface;

      // ************************************************** *******************//
      // Deklaration von in der Typbibliothek definierten CoClasses
      // (HINWEIS: Hier wird jede CoClass zu ihrer Standardschnittstelle
      // zugewiesen)
      // ************************************************** *******************//
      Textedit = ITextedit;

      // ************************************************** *******************//
      // Schnittstelle: ITextedit
      // Flags: (4416) Dual OleAutomation Dispatchable
      // GUID: {0D8D24A5-68A4-4F9A-B80C-5FBEF41AA208}
      // ************************************************** *******************//
      ITextedit = interface(IDispatch)
      ['{0D8D24A5-68A4-4F9A-B80C-5FBEF41AA208}']
      procedure Oeffnen(const aName: WideString); safecall;
      end;

      // ************************************************** *******************//
      // DispIntf: ITexteditDisp
      // Flags: (4416) Dual OleAutomation Dispatchable
      // GUID: {0D8D24A5-68A4-4F9A-B80C-5FBEF41AA208}
      // ************************************************** *******************//
      ITexteditDisp = dispinterface
      ['{0D8D24A5-68A4-4F9A-B

      Comment


      • #4
        Hallo Herr Kosch,

        Hier der DPR-File:

        program Text;

        uses
        Forms,
        WinTypes,
        WinProcs,
        SysUtils,
        DDEMan,
        MAIN in 'MAIN.PAS' {MainForm},
        CHILDWIN in 'CHILDWIN.PAS' {MDIChild},
        INFOU in 'INFOU.PAS' {InfoForm},
        ListForm in 'ListForm.pas' {WordlistForm},
        Urllistform in 'Urllistform.pas' {UrlListe},
        TextEditor_impl in 'TextEditor_impl.pas' {TextEdit: CoClass};

        {$R *.TLB}
        {$R *.RES}

        begin
        Application.Initialize;
        Application.CreateForm(TMainForm, MainForm);
        Application.CreateForm(TInfoForm, InfoForm);
        Application.CreateForm(TWordlistForm, WordlistForm);
        Application.CreateForm(TUrlListe, UrlListe);
        Application.Run;
        end.

        In einem anderen Projekt klappt das hervorragend. Der Initialisierungsteil in der *Impl registriert doch normalerweise die Klasse.

        initialization
        TAutoObjectFactory.Create(ComServer, TTextedit, Class_Textedit,
        ciMultiInstance, tmApartment);
        end

        Comment

        Working...
        X