我正在尝试在 Windows 10 上从我的 Delphi 程序(Delphi CE 10.4)执行
c:\windows\system32\rdpclip.exe
。
我可以从 Windows 资源管理器或 CMD 窗口中看到并执行此文件,但是当我尝试使用
FileExists('c:\windows\system32\rdpclip.exe')
时,它会返回错误 2(找不到文件)。如果我使用ShellExecute()
启动它,我也会找不到文件。
我可以从我的 Delphi 代码中看到并执行
c:\windows\system32\cmd.exe
就好了。 rdpclip.exe
上没有设置任何特殊属性 - 它们与 cmd.exe
上的属性相同。用户ID是本地管理员的成员,UAC控制设置为“禁用”以管理员批准模式运行所有管理员。
我还发现,如果我使用
c:\windows\system32
/FindFirst()
列出FindNext()
文件夹的内容,很多文件(包括rdpclip.exe
)没有列出,而其他的(例如,rdpsa.exe
显示在列表中,而rdpclip.exe
没有)。
rdpclip.exe
显示在文件资源管理器中,并且可以从 Windows 中的“运行”提示手动启动。在我的 Delphi 程序中使用 ShellExecute()
或 FindFirst()
/FindNext()
是不可见的。
同一文件夹中的其他文件(
cmd.exe
、rdpsa.exe
)是可见的,并且可以从同一个 Delphi 程序执行,使用相同的代码行(只需更改文件名)。
当然,我的期望是我的 Delphi 程序的行为方式与 Windows 中的文件资源管理器的行为方式相同。
所有这些文件的文件属性都没有区别,有效的访问控制表明当前用户已经读取/执行了所有有问题的文件。
您的程序找不到
rdpclip.exe
文件的原因是因为在 64 位版本的 Windows 文件夹上 Windows\System32
实际上并不像人们预期的那样包含任何 32 位库或程序,而是包含所有 64 位库和程序.
32 位库和程序实际上可以位于
Windows\SysWOW64
文件夹中。因此,当任何 32 位应用程序尝试访问 System32
文件夹时,它会自动重定向到 Sys64WOW
文件夹。如果您检查 Sys64WOW
文件夹,您会发现那里没有 rdpclip.exe
文件。
我建议您阅读有关文件系统重定向器的更多信息,以更好地理解您的问题。
编辑:您可以使用
System32
避免 Sysnative
文件夹重定向,因为它在 Could not find system file when it actually exists
您正在对 System32 的路径进行硬编码。从 Windows 95 开始(引入 System 文件夹时)是错误的;该代码有问题。
你必须使用:
SHGetKnownFolderPath(FOLDERID_System)
- Windows Vista 或更高版本SHGetFolderPath(CSIDL_SYSTEM)
- Windows 2000 或更高版本SHGetSpecialFolderPath(CSIDL_SYSTEM)
- Windows 95 或更高版本硬编码System文件夹的路径总是错误的。