3

Delphi 2007 でビルドされた CGI DLL を Windows 2008 サーバーにデプロイしました。内部的には、現在の 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 には、最大合計パス長 32,767 文字の拡張長パスを許可する Unicode バージョンもある多くの関数があります。このタイプのパスは、バックスラッシュで区切られたコンポーネントで構成され、それぞれが GetVolumeInformation 関数の lpMaximumComponentLength パラメータで返される値までです (この値は通常 255 文字です)。拡張パスを指定するには、「\\?\」プレフィックスを使用します。たとえば、「\\?\D:\非常に長いパス」。

32,767 文字の最大パスは概算です。これは、"\\?\" プレフィックスが実行時にシステムによって長い文字列に拡張される可能性があり、この拡張が全長に適用されるためです。

"\\?\" プレフィックスは、汎用命名規則 (UNC) に従って作成されたパスでも使用できます。UNC を使用してそのようなパスを指定するには、"\\?\UNC\" プレフィックスを使用します。たとえば、「\\?\UNC\server\share」の場合、「server」はコンピューターの名前で、「share」は共有フォルダーの名前です。これらのプレフィックスは、パス自体の一部としては使用されません。これらは、パスを最小限の変更でシステムに渡す必要があることを示します。つまり、スラッシュを使用してパス区切りを表すことも、ピリオドを使用して現在のディレクトリを表すことも、二重ドットを使用して親ディレクトリを表すこともできません。相対パスでは "\\?\" プレフィックスを使用できないため、相対パスは常に合計MAX_PATH文字数に制限されます。

Windows API 関数の Unicode バージョンを呼び出している限り、"\\?\"プレフィックスを削除する必要はありません。あなたが渡された道は有効な道だからです。

コメントで発見したように、API 関数の ANSI バージョンを呼び出していました。それを行うと、"\\?\"プレフィックスは無効になります。したがって、Unicode API 関数に固執すれば、それで問題ありません!

于 2012-11-26T21:57:02.263 に答える