Avatar billede tknudsen Nybegynder
23. august 2000 - 11:07 Der er 9 kommentarer og
2 løsninger

execute file

Da jeg ikke fatter at bruge søgeværktøjet (søge resultaterne bliver åbentbart fundet fra samtlige katagorier) stiller jeg lige dette spøgsmål (som mange før mig):

Hvordan kan jeg holde styr på om et program jeg starter fra delphi via ShelleExecute el.lign. er startet. ?

Jeg skal lave en slags splash screen som skal være en selvstændig app og som skal terminere når det egentlige program er startet.
Avatar billede sjensen Nybegynder
23. august 2000 - 11:13 #1
Der er flere måder at styre det på, afhængig af om det er dig selv der også laver det program du starter fra Delphi:

Hvis du selv laver begge programmer, kan du f.eks. hente et free-ware komponent på delphi superpage der hedder \"JustOne\". Dette sørger for at programmet kun kan startes en gang, og hvis man starter det igen, afbrydes den nye version og den oprindelige får fokus.

Hvis du ikke selv laver det skal du lege lidt med API kald og bruge FindWindowHandle hvor du f.eks. bruge den caption programmet, som søge streng. For Delphi selv er denne caption f.eks. \"Delphi 5.0\". Caption er dne tekst der fremgår at den blå linie øverst i hovedvinduet.

Hvis funktionen returnerer en handle findes programmet allerede (d.v.s. at det er aktivt)
Avatar billede tknudsen Nybegynder
23. august 2000 - 11:17 #2
ok - så i \'splash\' programmet skal jeg starte den eksterne app med - feks - ShellExecute og gå i en løkk ehvor jeg hele tiden spørger om programmet kører via FindWindowHandle ?
Avatar billede sjensen Nybegynder
23. august 2000 - 11:26 #3
Ja, noget i den stil. Jeg er ikke helt sikker på om funktionen ikke bare er en alm. delphi funktion der hedder \"FindWindow\" men det kan du jo checke.

Starter du først splash-screen programmet og derefter det oprindelige program fra samme delphiprogram ? Hvis du gør kan du jo bare gemme den handle dit splash-screen program får af executefile, og i selve programmet vente indtil du har fået en handle til det oprindelige program, og derefter terminere splash-screen programmet.
Avatar billede kim_friis Nybegynder
23. august 2000 - 11:27 #4
Det her er den måde hvorpå jeg exekvere et program og så venter på at det vender tilbage, hvis du selv ønsker at lukke det kan du jo så gøre det vha. det handle du har i PI.hProcess.

Kim

RegisterExitCode := Win32Check(CreateProcess(PChar(ExeName), PChar(ExeName+ \' \'+Args),nil, nil, True, 0, nil, nil, SI, PI));

  if RegisterExitCode then begin
      //We have executed the program, and are waiting for it to return
      if WaitForSingleObject(PI.hProcess,10000) = WAIT_OBJECT_0 then begin
        //The program exitet the right way.
      end;

Avatar billede tknudsen Nybegynder
23. august 2000 - 12:14 #5
sjensen >> hvordan virker FindWindow - ved jeg hvad class navn er - eller skal jeg bare søge på window navnet ?
Avatar billede tknudsen Nybegynder
23. august 2000 - 12:15 #6
kim_friis >> det er nærmest det omvendte jeg vil lave. Nemlig starte programmet og vente på det er startet. Programmet det skal startes laver en del tabelopslag ved start derfor tager det noget tid før det egentlig er startet.
Avatar billede sjensen Nybegynder
23. august 2000 - 12:27 #7
Jeg tog alligevel fejl. Det hedder kun FindWindow (eller FindWindowEx) men det er et API kald:

Her er lidt fra Win32.hlp filen (Borland Shared\\MSHelp):

The FindWindowEx function retrieves the handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the given child window.

HWND FindWindowEx(

    HWND hwndParent,    // handle to parent window
    HWND hwndChildAfter,    // handle to a child window
    LPCTSTR lpszClass,    // pointer to class name
    LPCTSTR lpszWindow    // pointer to window name
  );   


Parameters

hwndParent

Identifies the parent window whose child windows are to be searched.
If hwndParent is NULL, the function uses the desktop window as the parent window. The function searches among windows that are child windows of the desktop.

hwndChildAfter

Identifies a child window. The search begins with the next child window in the Z order. hwndChildAfter must be a direct child window of hwndParent, not just a descendant window.
If hwndChildAfter is NULL, the search begins with the first child window of hwndParent.
Note that if both hwndParent and hwndChildAfter are NULL, the function searches all top-level windows.

lpszClass

Points to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpszClass; the high-order word must be zero.

lpszWindow

Points to a null-terminated string that specifies the window name (the window\'s title). If this parameter is NULL, all window names match.

*****************************

Og der er kun \"lpszWindow\" du behøver for at finde den handle alle winduer har.
Avatar billede kim_friis Nybegynder
23. august 2000 - 12:41 #8
I så fald smider du de sidste 3 linier væk og når dit program så er færdigt med at loade så bruger du evt. :TerminateProcess med pi.hprocess som parameter og så skulle det være det?
Avatar billede tknudsen Nybegynder
23. august 2000 - 13:21 #9
kim_friis >> jeg vil gerne starte programmet sådan at det er et \'selvstændigt\' program - altså ikke som child til \'splash\'-applikationen. Kan du fortælle mig hvilke parametre i CreateProcess som påvirker dette ?
Avatar billede kim_friis Nybegynder
23. august 2000 - 13:30 #10
Hvorfor ikke vende det om således at det er hovedapplikationen som starter \'splash\' applikationen op som det første den gør? På den måde mener jeg også at du nemmere kan styre hvornår at splash applikationen skal lukkes!
Avatar billede tknudsen Nybegynder
23. august 2000 - 13:41 #11
kim_friis >> fordi det er en skod applikation der er lavet for laang tid siden jeg ikke har nogen kontrol over. Det er et program som ligger på en fil server og som skal kunne afvikles af mange samtidige brugere, men det styrer serveren. Derimod skal der installeres BDE drivere og i den forbindelse vil jeg lave et program som peger på applikationen som ligger på serveren, som under installation opretter et ikon på desktoppen. Derfor kan jeg ikke lave splash screenen i programmet på serveren. Det er ikke for at lave en splash screen jeg laver dette, men for at omgå førnævnte problemer med installation af BDE drivere, oprettelse af \'genvej\' på desktop som egentlig bare er en genvej til \'splash\' programmet som starter applikationen på nettet (pfeww :-)

Men tak for hjælpen begge to - jeg har fikset en løsning nu
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Politiets Efterretningstjeneste

Data engineer til PET

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Senior specialister (DevSecOps) til Forsvarets nye Digitale Backbone

Forsvarets Efterretningstjeneste

Linux Infrastructure Specialist

Forsvarsministeriets Materiel- og Indkøbsstyrelse

IT-supporter til lokal IT støtte i Tirstrup