Delphi 7 - ShellExecute command not working in situations -


i have made game launcher , use command:

 procedure tfmain.imgbtn1click(sender: tobject);      begin       shellexecute(tform(owner).handle, nil, 'starter.exe', '-lang rus', nil, sw_shownormal);      end; 

with '-lang rus' parameter. works fine. game launches , language in russian(if put '-lang eng' still works fine , game in english).

the starter.exe application inside folder named ''bin''. when want relocate launcher outside folder use command:

procedure tfmain.imgbtn1click(sender: tobject);      begin       shellexecute(tform(owner).handle, nil, 'bin\starter.exe', '-lang rus', nil, sw_shownormal);      end; 

but game isn't launching. nothing happens. should change?

you have use full path application trying start.

extractfilepath(application.exename) give full path launcher exe.

solution 1: using shellexecute

procedure tfmain.imgbtn1click(sender: tobject); var    executeresult: integer;   path: string; begin   path := includetrailingpathdelimiter(extractfilepath(application.exename));   executeresult := shellexecute(0, nil, pchar(path + 'bin\starter.exe'), '-lang rus', nil, sw_shownormal);   if executeresult <= 32 showmessage('error: ' + inttostr(executeresult)); end; 

you can find list of error codes at: shellexecute function documentation

most common error codes:

  • error_file_not_found 0x2
  • error_path_not_found 0x3

solution 2: using shellexecuteex

var   filename, parameters, folder: string;   sei: tshellexecuteinfo;   error: dword;   ok: boolean; begin   folder := includetrailingpathdelimiter(extractfilepath(application.exename)) + 'bin\';   filename := folder + 'starter.exe';   parameters := '-lang rus';   zeromemory(@sei, sizeof(sei));   sei.cbsize := sizeof(sei);   sei.lpfile := pchar(filename);   sei.lpparameters := pchar(parameters);   sei.lpdirectory := pchar(folder);   sei.nshow := sw_shownormal;   ok := shellexecuteex(@sei);   if not ok     begin       error := getlasterror;       showmessage('error: ' + inttostr(error));     end; end; 

shellexecuteex documentation

solution 3: using createprocess

function executeprocess(const filename, params: string; folder: string; waituntilterminated, waituntilidle, runminimized: boolean;   var errorcode: integer): boolean; var   cmdline: string;   workingdirp: pchar;   startupinfo: tstartupinfo;   processinfo: tprocessinformation; begin   result := true;   cmdline := '"' + filename + '" ' + params;   if folder = '' folder := excludetrailingpathdelimiter(extractfilepath(filename));   zeromemory(@startupinfo, sizeof(startupinfo));   startupinfo.cb := sizeof(startupinfo);   if runminimized     begin       startupinfo.dwflags := startf_useshowwindow;       startupinfo.wshowwindow := sw_showminimized;     end;   if folder <> '' workingdirp := pchar(folder)   else workingdirp := nil;   if not createprocess(nil, pchar(cmdline), nil, nil, false, 0, nil, workingdirp, startupinfo, processinfo)     begin       result := false;       errorcode := getlasterror;       exit;     end;   processinfo     begin       closehandle(hthread);       if waituntilidle waitforinputidle(hprocess, infinite);       if waituntilterminated         repeat           application.processmessages;         until msgwaitformultipleobjects(1, hprocess, false, infinite, qs_allinput) <> wait_object_0 + 1;       closehandle(hprocess);     end; end;  procedure tform1.button4click(sender: tobject); var   filename, parameters, folder: string;   error: integer;   ok: boolean; begin   folder := includetrailingpathdelimiter(extractfilepath(application.exename)) + 'bin\';   filename := folder + 'starter.exe';   parameters := '-lang rus';   ok := executeprocess(filename, parameters, folder, false, false, false, error);   if not ok     begin       error := getlasterror;       showmessage('error: ' + inttostr(error));     end; end; 

createprocess documentation


Comments

Popular posts from this blog

ruby on rails - RuntimeError: Circular dependency detected while autoloading constant - ActiveAdmin.register Role -

c++ - OpenMP unpredictable overhead -

javascript - Wordpress slider, not displayed 100% width -