このコードをインタラクティブ環境で実行することはできますが、デバッガーまたは .exe ファイルからコードを実行するとクラッシュします。
エラーを忘れました: FatalExecutionEngineError が検出されました! ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド 0x1104 の 0x6c9781b0 でした。エラー コードは 0xc0000005 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。
.net 4.5 の使用
open System.IO
open System.Runtime.InteropServices
open System.Text
[<DllImport("kernel32.dll",CharSet = CharSet.Auto, SetLastError=true)>]
extern uint32 GetShortPathName(
[<MarshalAs(UnmanagedType.LPWStr)>] string longpath,
[<MarshalAs(UnmanagedType.LPWStr)>] StringBuilder shortpath,
[<MarshalAs(UnmanagedType.U4)>] uint32 item)
let MakeShortName(longPath : string) =
let sb = StringBuilder()
let currPath = longPath
let item = 1024u
// let blah = ""
//win32 assigns shortPath
let blah32 = GetShortPathName(currPath, sb, item)
sb.ToString()
[<EntryPoint>]
let main argv =
let path = @"C:\dev\shortName\shortName"
let shorty = MakeShortName path
printfn "%s" shorty
let x = System.Console.ReadKey()
0
インタラクティブ環境
$ (me alt+上記の 2 つの関数を入力)
val GetShortPathName : 文字列 * StringBuilder * uint32 -> uint32 val MakeShortName : 文字列 -> 文字列
$ MakeShortName @"C:\dev\shortName\shortName";; val it : string = "C:\dev\SHORTN~1\SHORTN~1"