3

我在 Windows 2008 服务器上部署了一个使用 Delphi 2007 构建的 CGI DLL。在内部我需要使用当前的 DLL 路径。

通常我可以使用GetModuleFileNameor GetModuleName,但在服务器上它们都返回:

\\?\c:\my\correct\path

为什么是前 4 个字符?它看起来像一个网络路径?有什么办法可以排除前 4 个字符?

4

1 回答 1

1

相关文档是这样的:

最大路径长度限制

在 Windows API(以下段落中讨论的一些例外情况)中,路径的最大长度为MAX_PATH,定义为 260 个字符。本地路径按以下顺序构造:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件和终止空字符。例如,驱动器 D 上的最大路径是“D:\some 256-character path string”,其中“”表示当前系统代码页的不可见终止空字符。(字符 < > 在此处用于视觉清晰,不能作为有效路径字符串的一部分。)

注意 Windows API 中的文件 I/O 函数将“/”转换为“\”作为将名称转换为 NT 样式名称的一部分,除非使用“\\?\”前缀,如以下部分所述。

Windows API 有许多函数也有 Unicode 版本,以允许最大总路径长度为 32,767 个字符的扩展长度路径。这种类型的路径由由反斜杠分隔的组件组成,每个组件都达到 GetVolumeInformation 函数的 lpMaximumComponentLength 参数中返回的值(该值通常为 255 个字符)。要指定扩展长度的路径,请使用“\\?\”前缀。例如,“\\?\D:\非常长的路径”。

注意 最大路径 32,767 个字符是近似值,因为系统在运行时可能会将“\\?\”前缀扩展为更长的字符串,并且此扩展适用于总长度。

“\\?\”前缀也可用于根据通用命名约定 (UNC) 构建的路径。要使用 UNC 指定此类路径,请使用“\\?\UNC\”前缀。例如,“\\?\UNC\server\share”,其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不用作路径本身的一部分。它们表明路径应该以最少的修改传递给系统,这意味着您不能使用正斜杠来表示路径分隔符,或者使用句点来表示当前目录,或者使用双点来表示父目录。因为您不能将“\\?\”前缀与相对路径一起使用,所以相对路径始终限于MAX_PATH字符总数。

只要您调用的是 Unicode 版本的 Windows API 函数,就不需要去掉"\\?\"前缀。因为你得到的路径是有效的路径。

正如我们在评论中发现的那样,您正在调用 API 函数的 ANSI 版本。当你这样做时,"\\?\"前缀无效。所以,坚持使用 Unicode API 函数,一切都很好!

于 2012-11-26T21:57:02.263 回答