Delphi - Wow64EnableWow64FsRedirection错误32位操作系统

时间:2018-02-21 22:39:38

标签: delphi

我有一个代码示例。

unit Unit1;

interface

uses
...

type
...

function Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection: BOOL): BOOL; stdcall;

var
...

implementation

{$R *.dfm}

uses
...

function Wow64EnableWow64FsRedirection; external kernel32 name 'Wow64EnableWow64FsRedirection';

procedure LaunchOSK;
begin
  Wow64EnableWow64FsRedirection(False);
  try
    ShellExecute(0, 'OPEN', PChar('osk.exe'), nil, nil, SW_SHOWNORMAL);
  finally
    Wow64EnableWow64FsRedirection(True);
  end;
end;

end.

此代码在64位操作系统中正常工作。但是,当您尝试在32位操作系统(XP)中使用它时,您会收到一条错误消息(过程入口点Wow64Enable64FsRedirection无法位于动态链接库kernel32.dll中。) 。如果您隔离Wow64EnableWow64FsRedirection并只运行ShellExecute,它就可以正常启动。

在过去的两天里,我尝试了不同的东西,我已经打了一针,而不是一个人在32位和64位安全启动OSK。即使是众所周知的德尔福大师的建议也行不通。

我不需要关于禁用Wow64EnableWow64FsRedirection的讲座。因为它暂时没有伤害没有犯规。

我需要的是理解如何在XP上运行应用程序时,如何使用此代码并隔离Wow64Enable64FsRedirection接口过程及其附带的实现部分以及LaunchOSK过程的必要部分。这可能吗???编译器语句没用,对吧?

如果不可能,那么我将不得不求助于生产2个应用程序(一个用于XP,另一个用于64位),这是最后的手段。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用dynamic loading并只检查GetProcAddress函数是否返回有效的函数地址。

或者您可以使用delayed loading并仅在操作系统版本和位数符合必要要求时调用导入的函数。

答案 1 :(得分:-1)

您的代码使用加载时间链接。导入的函数必须存在于系统中,否则您的可执行文件将无法启动。

相反,您需要使用运行时链接。使用LoadLibraryGetProcAddress链接到该功能。如果GetProcAddress无法找到该功能,那么它就不可用,当然您也不需要调用它,因为您使用的是32位操作系统。

执行此操作的正确方法是生成64位进程,然后可以启动OSK进程。如果您真的需要禁用重定向,请注意文档,告诉您使用Wow64DisableWow64FsRedirection

最后,最好使用CreateProcess启动流程。涉及shell和文件关联没有任何好处。为什么要求shell直接调用CreateProcess

好的,这通常是很好的建议,但OSK再一次很特别。请参阅Delphi - On Screen Keyboard (osk.exe) works on Win32 but fails on Win64