【发布时间】:2014-05-07 17:03:34
【问题描述】:
我发现一个通过拖放接受文件的 CLI 工具存在以下问题。
文件 X:\MyApp.exe 是一个 CLI 工具,需要 UAC 提升(将被授予)。
操作系统是Win7 32位。
X:是 NAS 的网络驱动器。
当我将 X:\MyDLL.dll 拖入 X:\MyApp.exe 时, FileExists(ParamStr(1)) 将为 false。 RaiseLastOSError() 将显示代码 3。我做错了什么?
当源文件存储在 C:(并拖入 EXE 文件中)时,它确实有效。
WriteLn('ParamStr 1 = '+ParamStr(1)); // X:\MyDLL.dll
if not FileExists(ParamStr(1)) then
begin
try
RaiseLastOSError;
except
on E: exception do
begin
Writeln(E.message); // (Translated) System error 3. The file could not be found.
end;
end;
exit;
end;
【问题讨论】:
-
它在没有海拔的情况下工作吗?
-
我认为驱动器在提升状态下没有被视为应用程序的映射。
-
您使用的是哪个版本的 Delphi?根据版本,
FileExists()可能会尝试不同的方法来尝试解决不同类型路径的存在问题。另外,在 UAC 中提升应用程序时,您是使用相同的用户帐户,还是登录到不同的用户帐户?映射的驱动器号是特定于用户的,因此如果您以不同的用户身份升级,它甚至可能根本不知道X:驱动器。 -
我使用 Delphi XE4 编译。提升是使用清单资源强制执行的。由于我已经登录了具有管理员权限的帐户(在 RDP 连接中),因此我只需在 UAC 对话框中单击“是”。由于用户相同,我假设网络驱动映射应该仍然存在?
-
@rinntech 不一定。映射驱动器是那些并不总是存在的东西之一。即使是同一个用户。例如,如果我有一个以特定用户登录的服务并尝试访问为同一用户映射但登录到桌面的驱动器,那么它将无法工作。