2012-05-24 10 views
5

に私はインタラクティブな環境で実行するには、このコードを取得することができますが、私はのWin32 API呼び出しのエラーGetShortPathName F#

デバッガからのファイルまたは.exeファイルからのコードがエラーを忘れた実行したときに、それがクラッシュ: FatalExecutionEngineErrorが検出されました! 実行時に致命的なエラーが発生しました。エラーのアドレスは、スレッド0x1104の0x6c9781b0にありました。エラーコードは0xc0000005です。このエラーは、CLRまたはユーザーコードの安全でない部分または検証不能な部分のバグである可能性があります。このバグの一般的な原因には、COM-interopまたはPInvokeのユーザーマーシャリングエラーがあり、スタックが破損する可能性があります。 - > UINT32文字列*のStringBuilder * UINT32:.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 

インタラクティブENV


$(私ALT +は、上記の二つの機能を入力)

ヴァルGetShortPathNameを使用して

val MakeShortName:文字列 - >文字列

$ MakeShortName @ "C:\ dev \ shortName \ shortName" ;; val:文字列= "C:\ dev \ SHORTN〜1 \ SHORTN〜1"

+1

を、その答えとして、それを投稿してください。 – pad

+0

それは8時間私を十分にすることはできません=/ –

+0

@DaveHanson私たちは自己応答のための担当者要件を下げました - 再度お試しください –

答えて

4

修正済みです。私はちょうど吸う

@ 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 
関連する問題