我在Windows 2008服务器上部署了使用Delphi 2007构建的CGI DLL。在内部我需要使用当前的DLL路径。
通常我可以使用GetModuleFileName
或GetModuleName
,但在服务器上他们都会返回:
\\?\c:\my\correct\path
为什么前4个字符?它看起来像一个网络路径?有没有办法排除前4个字符?
答案 0 :(得分:1)
相关的documentation是:
最大路径长度限制
在Windows API中(以下讨论了一些例外情况) 段落),路径的最大长度为
MAX_PATH
,即 定义为260个字符。本地路径的结构如下 顺序:驱动器号,冒号,反斜杠,名称组件分隔 反斜杠和终止空字符。例如, 驱动器D上的最大路径是“D:\某些256个字符的路径字符串” 其中“”表示不可见的终止空字符 当前的系统代码页。 (字符<>用于此处 视觉清晰度,不能成为有效路径字符串的一部分。)注意 Windows API中的文件I / O函数将“/”转换为“\”作为一部分 将名称转换为NT样式的名称,除非使用 “\\?\”前缀详见以下部分。
Windows API具有许多也具有Unicode版本的函数 允许一个扩展长度的路径,最大总路径长度为 32,767个字符。这种类型的路径由组件组成 用反斜杠分隔,每个都取决于返回的值 GetVolumeInformation的lpMaximumComponentLength参数 function(此值通常为255个字符)。指定一个 扩展长度路径,使用“\\?\”前缀。例如,“\\?\ D:\ very 漫长的道路“。
注意最大路径为32,767个字符是近似值,因为 “\\?\”前缀可以由系统扩展为更长的字符串 运行时间,此扩展适用于总长度。
“\\?\”前缀也可以用于根据构造的路径 通用命名约定(UNC)。使用指定此类路径 UNC,使用“\\?\ UNC \”前缀。例如,“\\?\ UNC \ server \ share”, 其中“server”是计算机的名称,“share”是其名称 共享文件夹。这些前缀不用作路径的一部分 本身。它们表明路径应该传递给系统 最小的修改,这意味着你不能使用前进 斜杠表示路径分隔符,或表示句点分隔符的句点 当前目录,或表示父目录的双点。 因为您不能将“\\?\”前缀与相对路径一起使用, 相对路径始终限制为总共
MAX_PATH
个字符。
只要您调用Windows API函数的Unicode版本,就不需要删除"\\?\"
前缀。因为您所处的路径是有效路径。
正如我们在评论中发现的那样,您正在调用API函数的ANSI版本。当您这样做时,"\\?\"
前缀无效。所以,坚持使用Unicode API函数,这一切都很好!