【发布时间】:2018-02-21 22:39:38
【问题描述】:
我有一个代码示例。
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,它会正常启动。
在过去的 2 天里,我一直在尝试我在 Google 上搜索过的不同的东西,但在安全地启动 32 位和 64 位 OSK 的情况下,我没有一个作品。即使是著名的 Delphi 大师的建议也不起作用。
我不需要关于禁用 Wow64EnableWow64FsRedirection 的讲座。既然是暂时的,就没有伤害没有犯规。
我需要了解如何获取此代码并隔离 Wow64Enable64FsRedirection 接口过程及其随附的实现部分以及例如当应用程序在 XP 上运行时 LaunchOSK 过程的必要部分。这可能吗???编译器语句没用,对吧?
如果这是不可能的,那么我将不得不求助于生产 2 个应用程序(一个用于 XP,另一个用于 64 位),这是最后的手段。
提前致谢。
【问题讨论】:
-
不错的尝试,维多利亚。将布尔值更改为布尔值。还为实现功能添加了“延迟”。应用程序现在开始正常。但是,当我启动 OSK 时,我收到“外部异常 C06D007F”错误。那好吧。启动过程中的 Wow64EnableWow64FsRedirection 代码也需要隔离。我想我可以测试 64 位操作系统。
-
不仅是位数。您还需要测试操作系统版本。或者您可以使用动态加载而不是延迟加载。
-
完成了。使用 64 位测试。其余代码完好无损。谢谢。最简单的解决方案总是最好的。就授予您胜利而言,您删除的评论是它,而不是您给出的答案。不知道如何根据评论奖励。
-
将代码编辑为最终更改,以防万一有人需要。
-
我在回答中也是这么说的。有一个关于错误参数类型的额外说明。但正如我所说,仅测试位数是不够的。你可以有64位的Windows XP,不会有这样的功能。
标签: delphi