23. august 2000 - 11:07Der 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.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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)
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 ?
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.
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.
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;
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.
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.
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?
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 ?
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!
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
Synes godt om
Ny brugerNybegynder
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.