看不到/执行“c:\windows\system32 dpclip.exe" 来自 Delphi 代码,但可以在文件资源管理器中使用相同的用户登录查看并执行它

问题描述 投票:0回答:2

我正在尝试在 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 中的文件资源管理器的行为方式相同。

所有这些文件的文件属性都没有区别,有效的访问控制表明当前用户已经读取/执行了所有有问题的文件。

delphi shellexecute findfirst
2个回答
1
投票

您的程序找不到

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


-1
投票

您正在对 System32 的路径进行硬编码。从 Windows 95 开始(引入 System 文件夹时)是错误的;该代码有问题。

必须使用:

硬编码System文件夹的路径总是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.