无法获取msconfig .exe在system32文件夹中运行shellexecute Delphi

时间:2012-10-11 23:07:51

标签: delphi winapi system32

我在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。

3 个答案:

答案 0 :(得分:6)

此行为是由File System Redirector引起的,因为您可以使用Wow64DisableWow64FsRedirectionWow64EnableWow64FsRedirection函数。

{$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.

答案 1 :(得分:3)

要从32位进程访问64位System文件夹,您应该直接使用特殊的“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;

答案 2 :(得分:2)

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

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