AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Word-AddIn - Absturz bei OnBeginShutdown
Thema durchsuchen
Ansicht
Themen-Optionen

Word-AddIn - Absturz bei OnBeginShutdown

Ein Thema von mjenke · begonnen am 19. Jan 2007 · letzter Beitrag vom 22. Jan 2007
Antwort Antwort
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#1

Word-AddIn - Absturz bei OnBeginShutdown

  Alt 19. Jan 2007, 16:00
Hallo, alle miteinander!


Ich sitze mal wieder an einem Problem mit meinem Word-AddIn, das mich schon die letzten Wochen beschäftigt. Und zwar passiert folgendes:

Word 2003 stürzt ab, wenn man es beendet. (Problembericht kann an Microsoft geschickt werden etc.)

Allerdings nur unter Windows2000.
Unter WindowsXP läuft alles einwandfrei.

In einem Word-AddIn müssen die Methoden der IDExtensibility2-Schnittstelle implementiert sein.

Das Problem tritt auf, bei dem Aufruf der zu implementierenden Methode "OnBeginShutdown"

Deklaration:
Delphi-Quellcode:
  TXConMag = class(TOfficeAddIn, IDTExtensibility2, IXConMag)
    private
      FDebug: Boolean;
      [...]
    protected
      procedure OnStartupComplete(var custom: PSafeArray); override; safecall;
      procedure OnBeginShutdown(var custom: PSafeArray); override; safecall;
      [...]
  end;
Implementierung:
Delphi-Quellcode:
procedure TXConMag.OnBeginShutdown(var custom: PSafeArray);
begin
  XConLog.Log ( 'TXConMag.OnBeginShutDown' );
  // Wenn nötig den Ursprungszustand wieder herstellen...
  if FDokOptsChangedByConfig then begin
    try FWordSettings.DokOptions_Write ( FDokOpts ); except end;
  end;
  // free the taken resources
  XConLog.Log ( 'TXConMag.OnBeginShutDown: Destroy Resources' );
  FGlobalConf.Destroy;
  FWordSettings.Destroy;
  FEnvColl.Destroy;
  FDokOpts.Destroy;
  XConLog.Log ( 'TXConMag.OnBeginShutDown: Destroy XConLog' );
  XConLog.Destroy;
  inherited OnBeginShutdown(custom);
end;
Unter WindowsXP wird sie aufgerufen, unter Windows2000 nicht. Dieser Aufruf funktioniert schon gar nicht erst.

Kennt jemand dieses Problem?


Matthias
Matthias Jenke
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Word-AddIn - Absturz bei OnBeginShutdown

  Alt 19. Jan 2007, 18:27
Du zerstörst deine ganzen Unterobjekte in OnBeginShutdown. Zu früh!!!
Ich würde das erst im Destruktor Destroy machen, der dann aufgerufen wird, wenn dein Plugin-Objekt wirklich entfernt wird.
Das Event gibt dir Gelegenheit um irgendwelche Daten zu speichern oder für eine Rückfrage beim Benutzer.
Das Objekt XConLog sollte definitiv erst im Destruktor ge"free"t werden.

Ausserdem darf man Destroy nie selbst direkt aufrufen:
Delphi-Quellcode:
XConLog.Destroy; // Falsch
XConLog.Free; // Richtig! die Methode Free ruft intern Destroy auf
Also Suche nach ".Destroy;" -> ersetzen durch ".Free;"

Und noch was:
Jedes (Unter-)Objekt, dass du mit Free freigibst lässt eine Spur zurück, nämlich die Object-Variable
die nun auf einen ungültigen Speicherbereich zeigt:
Delphi-Quellcode:
procedure TXConMag.OnBeginShutdown(var custom: PSafeArray);
begin
  FGlobalConf.Free; // Unterobjekt freigeben
  // aber FGlobalConf zeigt jetzt immer noch auf das alte ungültige Objekt
  // deshalb:
  FGlobalConf := nil;
  // jetzt zeigt das Objekt auf nil und kann mit Assigned(FGlobalConf) zumindest geprüft werden

  // freigeben und auf nil setzen kann man auch in einem Rutsch haben
  FreeAndNil(FGlobalConf);
Würden diese Freigaben der Unterobjekt im Destruktor stattfinden, dann würde FGlobalConf.Free ausreichen,
da keine Gefahr mehr besteht, dass mit FGlobalConf noch irgenetwas passiert.
Andreas
  Mit Zitat antworten Zitat
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#3

Re: Word-AddIn - Absturz bei OnBeginShutdown

  Alt 22. Jan 2007, 09:25
Hallo, shmia!


Vielen Dank für die Infos. Hatte letztlich mit dem Problem gar nichts zu tun, da ich feststellen musste, dass ich tatsächlich an einer Stelle im Code eine Exception auslöse, die ich nicht abgefangen habe. WindowsXP ist dabei anscheinend etwas toleranter als Windows2000.

Der folgende Code hat die Exception ausgelöst. Die Prüfung, ob Word ein aktives Dokument besitzt.
Result := FWord^.ActiveDocument <> nil; Inzwischen habe ich die Exception abgefangen und alles läuft wie es soll...


Den Hinweis mit dem FreeAndNil habe ich mir allerdings zu Herzen genommen und die Freigabe der Objekte in den Destruktor meiner Klasse aufgenommen und dies über FreeAndNil realisiert!

Danke!



Matthias
Matthias Jenke
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Word-AddIn - Absturz bei OnBeginShutdown

  Alt 22. Jan 2007, 10:21
Zitat von mjenke:
Den Hinweis mit dem FreeAndNil habe ich mir allerdings zu Herzen genommen und die Freigabe der Objekte in den Destruktor meiner Klasse aufgenommen und dies über FreeAndNil realisiert!
Dann hast du es noch nicht ganz 100% verstanden.
FreeAndNil wird dann verwendet, wenn Objekte ausserhalb des Destruktor freigegeben werden und die
Gefahr besteht, dass diese Objekt nochmals freigegeben wird oder sonstwie benützt wird.

Innerhalb des Destruktor reicht ein einfaches .Free aus, denn danach ist ja das Hauptobjekt zerstört und es werden keine weiteren Methoden ausgerufen.

Man kann natürlich überall FreeAndNil verwenden, aber das wäre an vielen Stellen Verschwendung von Rechenzeit.
Andreas
  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 18:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz