Delphi:如何确定应用程序是否在 Win32/Win64 下运行并在 64 位上自动启动 64 位版本?

Linux安全怪人

情况

我打算将我的 Delphi (XE6) GUI 应用程序的 32 位和 64 位版本捆绑在一个 Zip 存档中。

注意:在这个问题中,我们假设用户提取了整个存档,即没有直接从存档管理器运行可执行文件。

所以,让我们假设我们已经提取了存档并有两个文件:

  1. program.exe

  2. program64.exe

明确地说,命名约定是 32 位版本的名称中除了程序名称之外没有任何其他内容,而 64 位版本具有完全相同的程序名称和64后缀。

意图

如果用户在 64 位 Windows 机器上运行 32 位版本,我希望它检测到它,并关闭自身并运行 64 位版本。

笔记

在我自己的答案中,我将记录我在使用代码期间的所有发现,随时添加更好的答案或替代方案,如果它真的做出了一些贡献,我肯定会赞成。也许更重要的是,请对您发现错误的特定部分发表评论。

Linux安全怪人

启动其他可执行文件

首先,我们需要一个能够启动其他可执行文件的函数,下面是我非常通用的示例,您可以根据需要使用它来启动几乎任何其他可执行文件:

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;

笔记:

  1. 我故意添加了可选的命名空间,例如Winapi.ShellAPI...为了让您确切地知道这些函数的定义位置。

  2. 定义了 32 个错误代码,这就是为什么函数True在结果ShellExecute大于 时返回的原因32

  3. 我定义了 function 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;
    
  4. 可悲的是,我仍然不确定第一个ShellExecute 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;

笔记:

  1. 如您所见,该kernel32.dll函数IsWow64Process从中加载库和函数

  2. 每项安全措施都应到位,以便返回正确的结果。


运行程序

最后,我们需要调整我们的dpr文件。

在变量部分,添加:

var
{$IFNDEF WIN64}
  App64: string;
{$ENDIF}

附上主begin-end段到另一个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}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EXE不是有效的Win32应用程序,但在64位上运行

来自分类Dev

如何从64位版本制作32位程序?

来自分类Dev

如何在VBScript中在MS Windows 7 64位下引用WIN32对象

来自分类Dev

Java JDK的64位版本是否可以在运行32位版本的Ubuntu的64位计算机上使用?

来自分类Dev

如何在64位Win 7操作系统中运行32位dll(AxInterop.DHTMLEDLib)?

来自分类Dev

Win32上的64位Anaconda使用32位还是64位?

来自分类Dev

如何在64位OSX 10.7.2上运行32位应用程序?

来自分类Dev

如何在最近的Ubuntu 64位中运行32位应用程序

来自分类Dev

如何在Ubuntu 64位中运行32位应用程序?

来自分类Dev

如何在32位架构上运行64位应用程序

来自分类Dev

如何在32位和64位系统上运行exe Java应用程序?

来自分类Dev

如何在Ubuntu 64位中运行32位应用程序?

来自分类Dev

我是否需要为 64 位机器上的 32 位应用程序部署 32 位或 64 位 VC++ 运行时?

来自分类Dev

我可以从64位Win8运行32位Win7虚拟机吗

来自分类Dev

Ubuntu 32或64位版本?

来自分类Dev

无法启动64位Windows版本的应用程序:org.eclipse.ui.workbench无效-> NoClassDefFound

来自分类Dev

是否每个 Java 版本都有:32 位和 64 位版本?

来自分类Dev

ifort 64位版本;ifort 64与gfortran 64

来自分类Dev

我怎么知道我正在运行的是哪个版本的Chrome(32位或64位)?我该如何更改

来自分类Dev

我如何确定哪个Hadoop版本将在我的Ubuntu 14.10 64位上运行?

来自分类Dev

x86-64上的win10 32位

来自分类Dev

我运行的是32位还是64位?

来自分类Dev

无法在64位VM上运行32位程序

来自分类Dev

在64位gentoo linux上运行32位程序

来自分类Dev

无法在64位VM上运行32位程序

来自分类Dev

在32位系统上运行64位程序

来自分类Dev

在64位Ubuntu 15.10上运行32位程序

来自分类Dev

运行带有内存的32位程序以获得64位

来自分类Dev

如何在64位Ubuntu 13.10或更高版本上安装32位Brother驱动程序?

Related 相关文章

  1. 1

    EXE不是有效的Win32应用程序,但在64位上运行

  2. 2

    如何从64位版本制作32位程序?

  3. 3

    如何在VBScript中在MS Windows 7 64位下引用WIN32对象

  4. 4

    Java JDK的64位版本是否可以在运行32位版本的Ubuntu的64位计算机上使用?

  5. 5

    如何在64位Win 7操作系统中运行32位dll(AxInterop.DHTMLEDLib)?

  6. 6

    Win32上的64位Anaconda使用32位还是64位?

  7. 7

    如何在64位OSX 10.7.2上运行32位应用程序?

  8. 8

    如何在最近的Ubuntu 64位中运行32位应用程序

  9. 9

    如何在Ubuntu 64位中运行32位应用程序?

  10. 10

    如何在32位架构上运行64位应用程序

  11. 11

    如何在32位和64位系统上运行exe Java应用程序?

  12. 12

    如何在Ubuntu 64位中运行32位应用程序?

  13. 13

    我是否需要为 64 位机器上的 32 位应用程序部署 32 位或 64 位 VC++ 运行时?

  14. 14

    我可以从64位Win8运行32位Win7虚拟机吗

  15. 15

    Ubuntu 32或64位版本?

  16. 16

    无法启动64位Windows版本的应用程序:org.eclipse.ui.workbench无效-> NoClassDefFound

  17. 17

    是否每个 Java 版本都有:32 位和 64 位版本?

  18. 18

    ifort 64位版本;ifort 64与gfortran 64

  19. 19

    我怎么知道我正在运行的是哪个版本的Chrome(32位或64位)?我该如何更改

  20. 20

    我如何确定哪个Hadoop版本将在我的Ubuntu 14.10 64位上运行?

  21. 21

    x86-64上的win10 32位

  22. 22

    我运行的是32位还是64位?

  23. 23

    无法在64位VM上运行32位程序

  24. 24

    在64位gentoo linux上运行32位程序

  25. 25

    无法在64位VM上运行32位程序

  26. 26

    在32位系统上运行64位程序

  27. 27

    在64位Ubuntu 15.10上运行32位程序

  28. 28

    运行带有内存的32位程序以获得64位

  29. 29

    如何在64位Ubuntu 13.10或更高版本上安装32位Brother驱动程序?

热门标签

归档