GetShortPathName()が動作していないようにパスの入力文字列を返している:送られたとおりにGetShortPathName、予期しない結果
C:\Test\LongFolderNameToTestWith\BinarySearch.ini
?しかし
:
C:\Documents and Settings\LocalService\NTUSER.DAT
はパスの短い名前を負いませんので、私は私が正しくAPIを呼び出しています知っています。
しかし:
C:\Documents and Settings\LocalService\BinarySearch.ini
は、ファイル名のうち、短い名前がありませんが、パスの短い名前を作るん!
誰かが私にこの動作を理解させ、おそらく回避策を提案することができますか?
を追加しました:
私は
レガシーアプリに渡す8.3パス/ファイル名を作ることができるようにする必要がありますがどのようにこれを行うことができますか?
を追加しました:これは動作します
' ------------------------------------------------------------
' Library Name: Microsoft Scripting Runtime 1.0
' Library File: C:\WINDOWS\system32\scrrun.dll
' ------------------------------------------------------------
' Version Info:
' -------------
' Company Name: Microsoft Corporation
' File Description: Microsoft (R) Script Runtime
' File Version: 5.7.0.16599
' Internal Name: scrrun.dll
' Legal Copyright: Copyright (C) Microsoft Corp. 1996-2006, All Rights Reserved
' Original Filename: scrrun.dll
' Product Name: Microsoft (R) Script Runtime
' Product Version: 5.7.0.16599
' ------------------------------------------------------------
' ProgID: Scripting.FileSystemObject
' Interface Name: ScriptingFileSystemObject
'
' Interface Prefix: Scripting
:MUCH読み取り後の溶液
/実験は、これを行うための唯一確実な方法は、オートメーションを使用しているようです。 BASICで
単純な実装は次のようになります。
$PROGID_ScriptingFileSystemObject = "Scripting.FileSystemObject"
Interface Dispatch ScriptingFileSystemObject
Member CALL GetFile <&H0000271C>(IN FilePath AS STRING<&H00000000>) AS ScriptingIFile
Member CALL GetFolder<&H0000271D>(IN FolderPath AS STRING<&H00000000>) AS ScriptingIFolder
END Interface
Interface Dispatch ScriptingFile
Member GET ShortPath<&H000003EA>() AS STRING
Member GET ShortName<&H000003E9>() AS STRING
END Interface
Interface Dispatch ScriptingFolder
Member GET ShortPath<&H000003EA>() AS STRING
Member GET ShortName<&H000003E9>() AS STRING
END Interface
'-----------------------------------------------------------------------------
FUNCTION FileShortPath(BYVAL sPathnFile AS STRING, sShort AS STRING) AS LONG
LOCAL vResult, vFilePath AS Variant
LOCAL fso AS ScriptingFileSystemObject
LOCAL oFile AS ScriptingFile
IF LEN(sPathnFile) = 0 THEN EXIT FUNCTION ' Nothing sent
SET fso = NEW ScriptingFileSystemObject IN $PROGID_ScriptingFileSystemObject
IF IsNothing(fso) THEN FUNCTION = -1 : EXIT FUNCTION
SET oFile = NEW ScriptingFile IN $PROGID_ScriptingFileSystemObject
IF IsNothing(oFile) THEN FUNCTION = -2 : EXIT FUNCTION
vFilePath = sPathnFile
vResult = Empty
OBJECT CALL fso.GetFile(vFilePath) TO vResult
SET oFile = vResult
IF IsNothing(oFile) THEN FUNCTION = -3 : EXIT FUNCTION
vResult = Empty
Object GET oFile.ShortName TO vResult
sShort = VARIANT$(vResult)
vResult = Empty
Object GET oFile.ShortPath TO vResult
sShort = VARIANT$(vResult)
IF LEN(sShort) THEN FUNCTION = 1 ' Success
END FUNCTION
をご提案ありがとうございました。
私はまだ8.3のパス/ファイル名を確実に作成する方法を見つけようとしています。
GETSHORTPATHNAMEを使用する以外にこれを行う方法はありますか?
解決済み。上記を参照してください
これは、MSがこれをCOM deciplesでのみサポートしているようです...なぜ、今はC APIで信頼性が低いのか不思議です。
あなたはあなたを悩ましているコードを逐語的に投稿できますか? – dirkgently
DWORD WINAPI GetShortPathName( __in LPCTSTR lpszLongPath、 __out LPTSTR lpszShortPath、 __in DWORD cchBuffer ); しかし、言及されたようにここでの呼び出しは問題ではありません... –
関数宣言はそれほど役に立ちません。問題を再現する簡単な例を提供できる場合は、役立つかもしれません。 – dirkgently