5

ショート バージョンまたは DOS 形式 ( 「C:/DOCUME~1」など) のパスがあり、そのフル パス/ロング パス ( 「C:/Documents And Settings」など)を取得したい。

GetLongPathName api を試しました。出来た。しかし、ユニコードファイル名を扱うと失敗します。

Private Declare Function GetLongPathName Lib "kernel32" Alias _
    "GetLongPathNameA" (ByVal lpszShortPath As String, _
    ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

代わりに GetLongPathNameW のエイリアスを作成しようとしましたが、Unicode ファイル名と非 Unicode ファイル名の両方で、常に 0 を返すように見えます。MSDN には、C/C++ の GetLongPathNameW に関する記事しかありません。何か間違ったことをしてもいいですか?

この場合の解決策はありますか?Google と StackOverflow に何時間も費やしていますが、わかりません。

よろしく、

4

2 に答える 2

4

これはうまくいきますか?ファイルパスを短いパス名に変換してから再度変換すると、Unicode (C:/Tö+ など) の場合でも正しい文字列が得られます。

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
    (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long
Private Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameA" _
    (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

Public Function GetShortPath(ByVal strFileName As String) As String
    'KPD-Team 1999
    'URL: [url]http://www.allapi.net/[/url]
    'E-Mail: [email]KPDTeam@Allapi.net[/email]
    Dim lngRes As Long, strPath As String
    'Create a buffer
    strPath = String$(165, 0)
    'retrieve the short pathname
    lngRes = GetShortPathName(strFileName, strPath, 164)
    'remove all unnecessary chr$(0)'s
    GetShortPath = Left$(strPath, lngRes)
End Function

Public Function GetLongPath(ByVal strFileName As String) As String
    Dim lngRes As Long, strPath As String
    'Create a buffer
    strPath = String$(165, 0)
    'retrieve the long pathname
    lngRes = GetLongPathName(strFileName, strPath, 164)
    'remove all unnecessary chr$(0)'s
    GetLongPath = Left$(strPath, lngRes)
End Function

Private Sub Test()
    shortpath = GetShortPath("C:/Documents And Settings")

    Longpath = GetLongPath(shortpath)
End Sub
于 2012-07-11T22:00:31.223 に答える
1

vb6/vba の W 関数を使用するには、すべての文字列パラメーターを long として宣言します。

Private Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameW" _
  (ByVal lpszShortPath As Long, _
   ByVal lpszLongPath As Long, _
   ByVal cchBuffer As Long) As Long

StrPtr(a_string)だけの代わりに渡しa_stringます。

あなたが持っていた場合:

dim s_path as string
dim l_path as string

s_path = "C:\DOCUME~1"
l_path = string$(1024, vbnullchar)

GetLongPathNameA s_path, l_path, len(l_path)

それはなるだろう

dim s_path as string
dim l_path as string

s_path = "C:\DOCUME~1"
l_path = string$(1024, vbnullchar)

GetLongPathNameW strptr(s_path), strptr(l_path), len(l_path)
于 2012-07-11T22:18:59.523 に答える