Announcement

Collapse
No announcement yet.

DispID > z.B. ActiveDocument.SaveAs ???? > Andreas Kosch oder anderen Spezialisten

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

  • DispID > z.B. ActiveDocument.SaveAs ???? > Andreas Kosch oder anderen Spezialisten

    Hallo,

    woher bekomme ich den DispID von von z.B. AcitveCocument.SaveAs einer Word-OLE-Automation.

    Mit dem Beispielprogramm aus dem Buch "COM/DCOM Andreas Kosch" bekomme ich nur die DispID der ersten Instanz z.B. "Documents" zurück, bei der Abfrage
    "AcitveCocument.SaveAs" oder "SaveAs" bekomme ich die Fehlermeldung "Unbekannter name " zurück.

    Ich arbeite an dem Beispiel "Word8aut" im Delphi Verzeichnis.
    In diesem Beispiel werden die DispID's dazu verwendet,um zu erkennen ob ein Anwender z.B die Word Anwendung schliesst. Aber wie erkenne ich ob ein Anwender sein Document speichert??

    Danke Michael

  • #2
    Hallo,

    leider fehlt die Information, welche Delphi-Version verwendet wird. Um Delphi 5 kann es sich nicht handeln, denn dann ist das Beispielprojekt <i>Word8Auto.dpr</i> das "falsche" Beispiel, da Delphi 5 in der Lage ist, VCL-Wrapperkomponenten anzulegen. Im Fall von Delphi 5 ist das Beispielprojekt aus dem Verzeichnis <i>Demos\ActiveX\Oleauto\SrvComp\Word</i> das richtige.

    In dem Beispielprojekt <i>Word8Auto.dpr</i> wird in der Unit <i>AutoImpl.pas</i> die importierte Typbibliothek von Word über die Unit <b>Word97.pas</b> eingebunden. Und dort sind alle von Word verwendeten Interfaces zusammen mit den DispID-Werten zu finden:
    <pre>
    // ************************************************** *******************//
    // DispIntf: _DocumentDisp
    // Flags: (4432) Hidden Dual OleAutomation Dispatchable
    // GUID: {0002096B-0000-0000-C000-000000000046}
    // ************************************************** *******************//
    _DocumentDisp = dispinterface
    ['{0002096B-0000-0000-C000-000000000046}']
    property Name: WideString readonly dispid 0;
    property Application: WordApplication readonly dispid 1;
    property Creator: Integer readonly dispid 1001;
    property Parent: IDispatch readonly dispid 1002;
    property BuiltInDocumentProperties: IDispatch readonly dispid 1000;
    property CustomDocumentProperties: IDispatch readonly dispid 2;
    property Path: WideString readonly dispid 3;
    ....
    procedure SaveAs(var FileName: OleVariant; var FileFormat: OleVariant;
    var LockComments: OleVariant; var Password: OleVariant;
    var AddToRecentFiles: OleVariant; var WritePassword: OleVariant;
    var ReadOnlyRecommended: OleVariant; var EmbedTrueTypeFonts: OleVariant;
    var SaveNativePictureFormat: OleVariant; var SaveFormsData: OleVariant;
    var SaveAsAOCELetter: OleVariant); dispid 102;
    ....
    </pre>

    Allerdings ist es nicht sinnvoll, den von Borland im Beispiel von <i>AutoImpl.pas</i> getriebenen Aufwand selbst zu implementieren. Wenn Delphi 5 nicht zur Verfügung steht, würde ich über das FreeWare-Tool <b>Delphi Event Sink Generator</b> spezielle Komponenten anlegen lassen, über die die Word-Ereignisse im Objektinspektor ausgewertet werden können. In meinem Buch <i>COM/DCOM mit Delphi</i> ist ein Beispiel dafür auf der Seite 240 zu finden. Auf der Seite http://www.techvanguards.com sind für dieses Tool Beispielprojekte für Word zu finden

    Comment


    • #3
      Hallo Andreas,

      ersteinmal Danke für deine Hilfe.

      Ich verwende Delphi5 und hoffentlich bald Delphi6.

      In dem Beispiel ...\SrvComp\Word vermisse ich die Möglichkeit festzustellen ob der Anwender sein Document speichert oder wie ich darauf zu reagiern habe wenn er Word nicht über eine "Delphi-Form" schliesst.

      Danke Michae

      Comment

      Working...
      X