我在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。
答案 0 :(得分:6)
此行为是由File System Redirector
引起的,因为您可以使用Wow64DisableWow64FsRedirection
和Wow64EnableWow64FsRedirection
函数。
{$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位版本。