2012-05-24 15 views
5

posso ottenere il codice per l'esecuzione in ambiente interattivo ma si blocca quando si esegue il codice dal debugger o dal file exeAPI Win32 chiamata Errore GetShortPathName in F #

dimenticato l'errore: è stato rilevato FatalExecutionEngineError! Il runtime ha riscontrato un errore irreversibile. L'indirizzo dell'errore era a 0x6c9781b0, sul thread 0x1104. Il codice di errore è 0xc0000005. Questo errore potrebbe essere un bug nel CLR o nelle parti non sicure o non verificabili del codice utente. Le fonti comuni di questo bug includono errori di marshalling dell'utente per COM-Interop o PInvoke, che possono danneggiare lo stack.

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

Interactive env


$ (mi alt + inserendo queste due funzioni)

val GetShortPathName: stringa * StringBuilder * Uint32 -> Uint32 val MakeShortName: stringa -> stringa

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

+1

Se hai risolto il tuo problema, si prega di inviare come risposta. – pad

+0

Non mi lascerà per 8 ore non sufficiente rep =/ –

+0

@DaveHanson abbiamo abbassato i requisiti di risposta per rispondere autonomamente - prova a rispondere di nuovo –

risposta

4

Risolto.

ho appena succhiare @ Win 32

marescialli rimossi

See soluzione:

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 
Problemi correlati