3

我在 Win 7 64b 上。我试图从我的 delphi 应用程序运行 msconfig。msconfig.exe 文件位于 system32 文件夹中。我将 msconfig.exe 复制到 c:\ ,效果很好。这看起来像是某种许可问题。

var
errorcode: integer;
 begin
   errorcode :=
ShellExecute(0, 'open', pchar('C:\Windows\System\msconfig.exe'), nil, nil, SW_NORMAL);
if errorcode <= 32 then
ShowMessage(SysErrorMessage(errorcode));
end;

有没有人看到这个并想出如何从 sys32 运行 msconfig.exe 。

4

3 回答 3

6

此行为是由File System Redirector您可以使用Wow64DisableWow64FsRedirectionandWow64EnableWow64FsRedirection函数的 as 解决方法引起的。

{$APPTYPE CONSOLE}


uses
  ShellAPi,
  SysUtils;

Function Wow64DisableWow64FsRedirection(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
  External 'Kernel32.dll' Name 'Wow64DisableWow64FsRedirection';
Function Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
  External 'Kernel32.dll' Name 'Wow64EnableWow64FsRedirection';


Var
  Wow64FsEnableRedirection: LongBool;

begin
  try
   Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
   ShellExecute(0, nil, PChar('C:\Windows\System32\msconfig.exe'), nil, nil, 0);
   Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
于 2012-10-11T23:33:59.113 回答
3

要从 32 位进程访问 64 位系统文件夹,您应该使用特殊的“SysNative”别名而不是直接使用“System32”文件夹:

PChar('C:\Windows\SysNative\msconfig.exe')

如果您需要支持 32 位操作系统版本或 64 位编译,请用于IsWow64Process()检测您的应用是否在 WOW64 下运行:

{$IFDEF WIN64}
function IsWow64: Boolean;
begin
  Result := False;
end;
{$ELSE}
function IsWow64Process(hProcess: THandle; out Wow64Process: BOOL): BOOL; stdcall; external 'kernel32.dll' delayed;

function IsWow64: Boolean;
var
  Ret: BOOL;
begin
  Result := False;
  // XP = v5.1
  if (Win32MajorVersion > 5) or
    ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1)) then
  begin
    if IsWow64Process(GetCurrentProcess(), Ret) then
      Result := Ret <> 0;
  end;
end;
{$ENDIF}

var
  errorcode: integer;
  SysFolder: string;
begin
  If IsWow64 then
    SysFolder := 'SysNative'
  else
    SysFolder := 'System32';
  errorcode := ShellExecute(0, 'open', PChar('C:\Windows\'+SysFolder'+\msconfig.exe'), nil, nil, SW_NORMAL);
  if errorcode <= 32 then
    ShowMessage(SysErrorMessage(errorcode));
end;
于 2012-10-12T04:11:01.570 回答
2

如果您正在构建一个 32 位 Delphi 应用程序,那么当它在 64 位 Windows 上运行时,System32 文件夹实际上会被重新映射。对于 32 位应用程序,System32 实际上是 SysWOW64。因为您从资源管理器或 cmd.exe 在 System32 中“看到”它,是因为这些是 64 位进程。在这种情况下,32 位进程无法“看到”实际的 64 位 System32 文件夹。

一种解决方案是获取支持 64 位目标的最新 Delphi 并构建 64 位版本。

于 2012-10-11T23:22:46.027 回答