3

私はWin 7 64bを使用しています。私のデルファイアプリから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を使用できる回避策によって発生します。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.
于 2012-10-11T23:33:59.113 に答える
3

32 ビット プロセスから 64 ビット システム フォルダにアクセスするには、「System32」フォルダを直接使用する代わりに、特殊な「SysNative」エイリアスを使用する必要があります。

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

32 ビット OS バージョンまたは 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 です。Explorerまたはcmd.exeからSystem32で「表示」されるのは、それらが64ビットプロセスであるためです。この場合、32 ビット プロセスは実際の 64 ビット System32 フォルダを「見る」ことができません。

1 つの解決策は、64 ビット ターゲットをサポートする最新の Delphi を入手し、64 ビット バージョンをビルドすることです。

于 2012-10-11T23:22:46.027 に答える