Announcement

Collapse
No announcement yet.

Bitte um Hilfe bei OLE mit Word

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

  • Bitte um Hilfe bei OLE mit Word

    Hoffentlich bin ich hier richtig!
    Kann mir bitte jemand helfen. Ich habe mir eine Dokumentenverwaltung geschrieben (Delphi5). Aus dieser werden an Word (98) via Serienbrief verschiedene Angaben übergeben. 'Speichern unter' habe ich in Word mit VisualBasic-Code realisiert u. hier wird der Dateiname in eine Textdatei geschrieben aus der ich dann in Delphi den Dateiname wieder übernehme. Aus verschiedenen Gründen möchte ich dies nun mit OLE realisieren. Ich habe in meine Anwendung (Name = Dokumente) einen OLE-Server eingebunden (= WCSDokumente) in diesem ist eine Funktion (TakeFileName) implementiert. Der OLE-Server wurde von Delphi in der Registry angemeldet unter "Dokumente.WCSDokumente". In VisualBasic kann ich den OLE-Server aber nicht ansprechen (Ich habe mit GetObject alle möglichen Variationen probiert) auch wenn ich ihn unter "Extras/Verweise" aktiviere. Was mache ich falsch.

  • #2
    Hallo,

    das Problem kann auf verschiedenen Wegen gelöst werden. Der einfachste und häufigste Weg besteht im direkten Zugriff auf <i>Microsoft Word</i> als <b>Automation</b>-Server, d.h. das eigene Delphi-Programm greift als <b>Controller</b> via "Fernbedienung" auf Word zu. Ab Delphi 5 stehen auf der <b>Servers</b>-Komponentenseite bereits die Komponenten zur Verfügung, die dazu benötigt werden. Im Demos-Unterverzeichnis von Word sich entsprechende Beispiele zu finden (<i>ActiveX\OleAuto\SrvComp\Word</i> und <i>ActiveX\OleAuto\Word</i>).

    Der zweite Weg - Word ruft als Controller einen eigenen (mit Delphi erstellten) Automation-Server auf - geht allerdings auch. Wenn dieser eigene Server unter Visual Basic (VBA?) nicht ansprechbar ist, würde ich zuerst nachprüfen, ob auch ein Delphi-Controller den Server über diesen Weg (späte Bindung) ansprechen kann.
    <pre>
    procedure TForm1.ButtonLateClick(Sender: TObject);
    var
    aSrv : Variant;
    begin
    aSrv := CreateOleObject('Dokumente.WCSDokumente');
    aSrv.TakeFileName('Dateiname');
    ShowMessage('Aufruf war anscheinend erfolgreich!');
    end;
    </pre&gt

    Comment


    • #3
      Hallo,

      ich sehe gerade, das in meiner ersten Antwort die Frage nach GetObject nicht beantwortet wurde. Wenn von Word aus die bereits laufende Instanz des Automation-Servers angesprochen werden soll, kommt die <b>Running Object Table</b> (ROT) ins Spiel. Wenn sich der eigene Automation-Server im System über den Aufruf von <b>RegisterActiveObject</b> registrieren lässt, kann sich ein Client über <b>GetActiveObject</b> mit dieser einen Server-Instanz verbinden.
      Das sieht in einem Beispiel für Delphi so aus:

      <b>Automation-Server</b>:
      <pre>
      procedure TROTServer2.Initialize;
      begin
      inherited Initialize;
      RegisterActiveObject(Self as IUnknown, CLASS_ROTServer2,
      ACTIVEOBJECT_WEAK, FSrvROTHandle);
      end;

      destructor TROTServer2.Destroy;
      begin
      RevokeActiveObject(FSrvROTHandle, nil);
      inherited Destroy;
      end;
      </pre>

      <b>Client</b>:
      <pre>
      uses ActiveX;

      procedure TForm1.ButtonConnectClick(Sender: TObject);
      var
      swMsg : WideString;
      aSrvObj : IUnknown;
      begin
      GetActiveObject(CLASS_ROTServer2, nil, aSrvObj);
      if Assigned(aSrvObj) then
      begin
      FROTSrv := aSrvObj as IROTServer2;
      swMsg := 'Connect mit ROT-Instanz';
      end
      else
      begin
      FROTSrv := CoROTServer2.Create;
      swMsg := 'Connect mit neuer Instanz';
      end;
      StatusBar1.SimpleText := swMsg;
      FROTSrv.Connect(GetCurrentThreadID, Now, swMsg);
      ListBoxMsg.Items.Add(swMsg);
      end;
      </pre>

      Eine detailliertere Beschreibung dieser Zusammenhänge findet sich in meinem Buch <b>COM/DCOM mit Delphi</b>.
      &#10

      Comment

      Working...
      X