Avatar billede jisch Mester
23. juli 2003 - 09:01 Der er 13 kommentarer og
1 løsning

Kør program FRA Delphi 5

Hej,
Hvilken kommando kan jeg bruge i et Delphi 5 program til at køre et andet program (en .exe fil)?
Avatar billede Slettet bruger
23. juli 2003 - 09:04 #1
Du skal bruge WinExec:

procedure Launch(AFileName : string);
const ERROR_FILE_NOT_FOUND = 2;
      ERROR_PATH_NOT_FOUND = 3;
      HFILE_ERROR = -1;
      OF_SEARCH = $0400;
var ReOpenBuff: TOfStruct;
    Cmd : array[0..255] of char;
    r : longint;
begin
  FillChar(Cmd, SizeOf(Cmd), #0);
  StrPCopy(Cmd, AFileName);
  r := ERROR_FILE_NOT_FOUND;
  if OpenFile(Cmd, ReOpenBuff, OF_SEARCH or OF_EXIST) <> HFILE_ERROR then
  begin
    StrPCopy(Cmd, AFileName);
    r := WinExec(Cmd, SW_SHOW);
  end;
  if (r = ERROR_FILE_NOT_FOUND) or (r = ERROR_PATH_NOT_FOUND) then
    raise Exception.CreateFmt( 'Unable to locate %s', [AFilename] )
  else if r < 32 then
    raise Exception.CreateFmt('Error opening %s: %d.', [AFilename, r] );
end;
Avatar billede squashguy Nybegynder
23. juli 2003 - 09:16 #2
WinExec() er nok lidt forældet.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/winexec.asp

Du bør bruge CreateProcess()

eller evt. ShellExecute() - så overlader du afviklingen til explorer (filens endelse afgør hvordan filen åbnes)
Avatar billede Slettet bruger
23. juli 2003 - 09:22 #3
ShellExecute er også god:

uses
  ShellApi;

function ShellOpenFile( hWnd : HWND; AFileName, AParams, ADefaultDir : string ) : integer;
begin
  result := shellapi.ShellExecute( hWnd, 'open', pChar( AFileName ),
                                  pChar(AParams), pChar(ADefaultDir),
                                  SW_SHOWDEFAULT );
  case result of
    0 :
    raise Exception.Create( 'The operating system is out of memory or resources.' );
    ERROR_FILE_NOT_FOUND :
      raise Exception.Create( 'The specified file was not found.' );
    ERROR_PATH_NOT_FOUND :
      raise Exception.Create( 'The specified path was not found.' );
    ERROR_BAD_FORMAT :
      raise Exception.Create( 'The .EXE file is invalid (non-Win32 .EXE or error ' +
                              'in .EXE image).' );
    SE_ERR_ACCESSDENIED :
      raise Exception.Create( 'The operating system denied access to the specified file.' );
    SE_ERR_ASSOCINCOMPLETE :
      raise Exception.Create( 'The filename association is incomplete or invalid.' );
    SE_ERR_DDEBUSY :
      raise Exception.Create( 'The DDE transaction could not be completed because ' +
                              'other DDE transactions were being processed.' );
    SE_ERR_DDEFAIL :
      raise Exception.Create( 'The DDE transaction failed.' );
    SE_ERR_DDETIMEOUT :
      raise Exception.Create( 'The DDE transaction could not be completed because the ' +
                              'request timed out.' );
    SE_ERR_DLLNOTFOUND :
      raise Exception.Create( 'The specified dynamic-link library was not found.' );
    SE_ERR_NOASSOC :
      raise Exception.Create( 'There is no application associated with the given ' +
                              'filename extension.' );
    SE_ERR_OOM :
      raise Exception.Create( 'There was not enough memory to complete the operation.' );
    SE_ERR_SHARE :
      raise Exception.Create( 'A sharing violation occurred.' );
  else
  end;
end;
Avatar billede stone Forsker
23. juli 2003 - 13:47 #4
når det bare er et extern program du vil starte kan du bruge:
bare udskift nedenstående sti til din

WinExec('C:\PROGRAMMER\TILBEHØR\MSPAINT.EXE', SW_SHOW);
Avatar billede janbb Juniormester
23. juli 2003 - 15:17 #5
stone: Er der nogen sti-option (a la ./) hvis man kun vil køre programmer der ligger i samme bibl. og på den måde vil gøre det mere univ. eller undgå de besværlige stibetebnelser der tit giver 'kludder'.
Avatar billede janbb Juniormester
23. juli 2003 - 15:29 #6
jo - jeg prøvede lige og det er fint nok.
Avatar billede stone Forsker
23. juli 2003 - 18:31 #7
jo no problemo...

du fjerner bare f.eks c:\programmer\tilbehør\

så vil den automatisk gå ud fra at programmet er i det aktuelle bibliotek.
Avatar billede janbb Juniormester
23. juli 2003 - 20:45 #8
Jeg synes dog at winexec ikke rigtig fungerer når man ønsker at køre en fil i fx MS explorer HTM, ASP, EXE el. lign., men kun når det er et selvstændigt program - og hvis man ønsker denne 'extra ting' er man altså nødt til at bruge shellexecute ? a la :
  Shellexecute(handle,'open',PChar(http://www.olsen.dk),nil,nil,sw_show);

  (må lige prøve om det osse fungerer).
Avatar billede janbb Juniormester
23. juli 2003 - 21:01 #9
ska være
Shellexecute(handle,'open',('http://www.olsen.dk'),nil,nil,sw_show);

og man skal tilføje shellapi i 'uses'

  (anede ikke der var noget der hed olsen.dk - men det måtte der jo self. osse være - ikk ?)
Avatar billede athlon-pascal Juniormester
23. juli 2003 - 21:03 #10
Det kan lige så godt være pænt, også her på E:
Shellexecute(handle, 'open', 'http://www.olsen.dk', nil, nil, sw_show);
Avatar billede stone Forsker
23. juli 2003 - 21:08 #11
ShellExecute(GetdesktopWindow(),nil,pChar('http://www.eksperten'),nil,nil,SW_SHOWNORMAL);
end;
Avatar billede stone Forsker
23. juli 2003 - 21:10 #12
how.... 'dk' mangler
Avatar billede athlon-pascal Juniormester
23. juli 2003 - 21:12 #13
Igen.
Det bliver meget pænere her på E, hvis man gør sådan:
ShellExecute(GetdesktopWindow(), nil, 'http://www.eksperten.dk', nil, nil ,SW_SHOWNORMAL);
Avatar billede jisch Mester
24. juli 2003 - 01:13 #14
Til alle disse glimrende svar og kommentarer, men specielt til STONE. ShellExecute virker fint hvis blot der ikke skal overføres en parameter. Det skal faktisk bruges i forbindelse med dit glimrende program KopiKontrol, jeg kan bare ikke få overført .ccd - filen fra mit kaldende program med ShellExecute. Er løsningen evt. AParams - Ups jeg prøver lige.
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