2012-05-24 20 views
5

puedo obtener este código a ejecutar en el entorno interactivo pero se bloquea cuando corro el código del depurador o desde el archivo .exeWin32 API GetShortPathName llamada error en Fa #

olvidó el error: se detectó FatalExecutionEngineError! El tiempo de ejecución ha encontrado un error fatal. La dirección del error estaba en 0x6c9781b0, en el hilo 0x1104. El código de error es 0xc0000005. Este error puede ser un error en el CLR o en las partes inseguras o no verificables del código de usuario. Las fuentes comunes de este error incluyen errores de clasificación de usuarios para COM-interop o PInvoke, que pueden dañar la pila.

Utilizando .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 

interactivos env


$ (me alt + entrar en las dos funciones anteriores)

val GetShortPathName: String * * StringBuilder uint32 -> uint32 val MakeShortName: cadena -> cadena

$ MakeShortName @ "C: \ dev \ shortName \ shortName" ;; val it: string = "C: \ dev \ SHORTN ~ 1 \ SHORTN ~ 1"

+1

Si usted ha resuelto su propia pregunta, por favor, puesto que como respuesta. – pad

+0

No me deja durante 8 horas no suficiente rep =/ –

+0

@DaveHanson hemos reducido los requisitos de representante para la auto-respuesta - por favor intente responder de nuevo –

Respuesta

4

Se arregló.

acabo de chupar @ Win 32

mariscales eliminados

Ver solución:

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