5

このコードをインタラクティブ環境で実行することはできますが、デバッガーまたは .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"

4

2 に答える 2

4

修正しました。

私はただ@ win 32を吸う

元帥を削除

解決策を参照してください:

open System.IO
open System.Runtime.InteropServices
open System.Text

[<DllImport("kernel32.dll",CharSet = CharSet.Auto, SetLastError=true)>]
extern int GetShortPathName(
    string longpath, 
    StringBuilder shortpath, 
    int  item)

let MakeShortName(longPath : string) =
    let sb =  StringBuilder()
    let currPath = longPath
    let item = 1024

   // 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
于 2012-05-24T19:12:01.393 に答える