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;
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;
Comments
Post a Comment