[Delphi 7 + Word] Wachten tot Word helemaal afgesloten is

Pagina: 1
Acties:

  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Vanuit Delphi 7 activeer ik Word met een bepaald document. Als Word afgesloten word, wil ik dat document met een loadfromfile (etc.) in een BLOB veld in een Access tabel opslaan.

Ik trigger dit met de OnQuit event van de TWordApplication. Het probleem is nu dat als deze trigger komt, Word al wel (half) afgesloten is maar de file nog net in gebruik is (bezig met opslaan). In Delphi krijg ik dan een foutmelding dat de file nog 'busy' is en in gebruik door een ander applicatie.

Hoe kan ik zien dat Word er helemaal klaar mee is?
- Zou ik een andere event kunnen gebruiken (kan er geen vinden die er op lijkt)
- Zou ik kunnen zien of die file niet meer busy is?
- Zou ik kunnen zien of Word helemaal afgesloten is?

Ik kom er nog niet uit, please help!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Na die onQuit kan je een 1500ms timertje starten en pas na die 1.5sec. de overige acties uitvoeren. Je kan ook met findwindow kijken of het Word-venster nog openstaat, maar dat werkt niet helemaal geweldig want Word kan na het sluiten nog bezig zijn met die actie.

Sole survivor of the Chicxulub asteroid impact.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Pseudocode:
code:
1
2
while(file.isbusy)
  sleep(10);

:?

Professionele website nodig?


Verwijderd

Hoe activeer je Word, je kunt namelijk met CreateProcess/ShellExecuteEx en WaitForSingleObject wel iets regelen.

zie hier voor voorbeeld code: http://www.swissdelphicenter.ch/torry/showcode.php?id=455

[ Voor 36% gewijzigd door Verwijderd op 26-06-2004 17:16 ]


  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
@AtleX: ik wil liever niet timen want deze software wordt op veel verschillende machines gezet en dan weet je nooit hoe lang het duurt. Dat weet je trouwens onder Windows uberhaupt nooit.

@curry684: zoiets dacht ik dus ook (zie de vraag) maar ik kan niks vinden waarmee ik kan zien of die file busy is.

@maui71: Word activeer ik met een TWordApplication; dat is voor mij vanuit Delphi het gemakkelijkst werken.

Bedankt allemaal maar ik ben nog niet veel verder :/

Verwijderd

ff iets uit het hoofd:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function IsFileLocked(filename : string) : boolean;
var
  fs : TFileStream;
begin
 
  try 
     try
        fs := TFileStream.Create(filename, fmOpenReadWrite OR fmShareExclusive); 
        Result := true;
     except
        Result := false;
     end;
  finally
     fs.free;
  end;   
end; 


of gevonden hier: http://www.scalabium.com/faq/dct0066.htm
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function FileInUse(FileName: string): Boolean;
var hFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then exit;
  hFileRes := CreateFile(PChar(FileName),
                                    GENERIC_READ or GENERIC_WRITE,
                                    0,
                                    nil,
                                    OPEN_EXISTING,
                                    FILE_ATTRIBUTE_NORMAL,
                                    0);
  Result := (hFileRes = INVALID_HANDLE_VALUE);
  if not Result then 
    CloseHandle(hFileRes);
end;

[ Voor 49% gewijzigd door Verwijderd op 26-06-2004 18:43 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

Het is met de Win32 API mogelijk om een change notifier aan een bestand te hangen, die aangeeft of een bestand verplaatst wordt of op een andere manier wijzigt. Ik kan de interface zo gauw niet vinden, maar misschien is het mogelijk om ook notificaties te ontvangen als de handles van een bestand veranderen. Zo gauw Word de write handle van het bestand teruggeeft aan het systeem zou je dan een notificatie ontvangen.

Een goede grap mag vrienden kosten.


Verwijderd

tomatoman schreef op 26 juni 2004 @ 19:22:
Het is met de Win32 API mogelijk om een change notifier aan een bestand te hangen, die aangeeft of een bestand verplaatst wordt of op een andere manier wijzigt. Ik kan de interface zo gauw niet vinden, maar misschien is het mogelijk om ook notificaties te ontvangen als de handles van een bestand veranderen. Zo gauw Word de write handle van het bestand teruggeeft aan het systeem zou je dan een notificatie ontvangen.
Ik ken de API, maar die is A. niet zo betrouwbaar, B. werkt niet 100% over netwerk (dacht ik), en C. je krijgt wel tig keer een call dat er iets met een bestand is gebeurd. (tenminste als we dezelfe api bedoelen :) )
Toch een andere dan ik bedoelde, ik denk dat tomatoman op deze doelde:
CreateIoCompletionPort

[ Voor 14% gewijzigd door Verwijderd op 26-06-2004 19:29 ]


  • janusja
  • Registratie: December 2001
  • Laatst online: 30-03 23:02
Heb uiteindelijk 'fileinuse' gebruikt en dat werkt prima.
CreateIoCompletionPort lijkt mooier maar werkt niet onder 98 en dat heb ik wel nodig.
Welbedankt allemaal! _/-\o_
Pagina: 1