启动其他可执行文件
首先,我们需要一个能够启动其他可执行文件的函数,下面是我非常通用的示例,根据您的需求,您可以使用它来启动几乎任何其他可执行文件:
function LaunchExecutableFile(const ExecutableFilePath, Parameters: string; const ShowCmd: Integer): Boolean;
begin
Result := Winapi.ShellAPI.ShellExecute(Application.MainFormHandle, 'open', PChar(StringFunctions.DoubleQuoteStr(ExecutableFilePath)), PChar(Parameters), nil, ShowCmd) > 32;
end;
笔记:
-
我故意添加了可选的名称空间,比如
Winapi.ShellAPI...
以便您确切地知道这些函数的定义位置。
-
定义了32个错误代码,这就是函数返回
True
如果结果是
ShellExecute
大于
32
.
-
我定义的函数
DoubleQuoteStr
,因为如果路径中有一些空格,则系统将在每个分隔的空格中查找文件,从而查找错误的路径。这是一个非常简单的函数,它是完全可选的,只是优化。这也是通用的,函数如下:
function DoubleQuoteStr(S: string): string;
begin
if (S = '') or (S = '"')
then S := '""'
else begin
if S[1] <> '"' then S := '"' + S;
if S[System.Length(S)] <> '"' then S := S + '"';
end;
Result := S;
end;
-
遗憾的是,我仍然不确定
贝壳执行
HWND
争论,更具体地说,如果我的一般方法是正确的,请随意纠正我!
检测64位系统
其次,我们需要一个能够检测64位系统的函数,更具体地说,如果可执行文件在wow64下运行。
function IsWow64Process: Boolean;
type
TIsWow64Process = function(AHandle: DWORD; var AIsWow64: BOOL): BOOL; stdcall;
var
hIsWow64Process: TIsWow64Process;
hKernel32: DWORD;
IsWow64: BOOL;
begin
Result := False;
hKernel32 := Winapi.Windows.LoadLibrary('kernel32.dll');
if hKernel32 = 0 then Exit;
try
@hIsWow64Process := Winapi.Windows.GetProcAddress(hKernel32, 'IsWow64Process');
if not System.Assigned(hIsWow64Process) then Exit;
IsWow64 := False;
if hIsWow64Process(Winapi.Windows.GetCurrentProcess, IsWow64) then
Result := IsWow64;
finally
Winapi.Windows.FreeLibrary(hKernel32);
end;
end;
笔记:
-
如您所见,函数加载库
kernel32.dll
功能
IsWow64Process
从它。
-
每项安全措施都应到位,以便返回正确的结果。
运行程序
最后,我们需要调整
dpr
文件。
在“变量”部分中,添加:
var
{$IFNDEF WIN64}
App64: string;
{$ENDIF}
把你的主菜包起来
begin
-
end
分成另一部分
开始
-
结束
.
并在开头添加如下内容:
{$IFNDEF WIN64}
App64 := System.SysUtils.ChangeFileExt(Application.ExeName, '64.exe');
if not (ProcessFunctions.IsWow64Process and System.SysUtils.FileExists(App64) and
ProcessFunctions.LaunchExecutableFile(App64, '', SW_SHOWNORMAL)) then
{$ENDIF}