64位的DllImport PathCanonicalize会导致内存损坏

dec*_*jau 1 c# 64-bit pinvoke

我试图在64位.NET程序集上使用DllImport(PInvoke)函数PathCanonicalize,它会导致内存损坏导致各种不良行为(崩溃,异常情况等等).(例如:System.AccessViolationException:尝试读取或写入受保护的内存.这通常表示其他内存已损坏.)

    [DllImport("shlwapi", CharSet = CharSet.Auto, EntryPoint="PathCanonicalize", SetLastError = true)]
    private static extern bool PathCanonicalize( [Out] StringBuilder lpszDst,[In] string lpszSrc );

    public static string MyPathCanonicalize(string path)
    {
        StringBuilder builder = new StringBuilder();
        if (!PathCanonicalize(builder, path))
            return path;
        return builder.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

我在这个帖子中看到我应该使用IntPtr而不是直接字符串.任何人都可以告诉我如何在PathCanonicalize中输入和输出字符串中的那些编组?

原型是:

BOOL PathCanonicalize(
  __out  LPTSTR lpszDst,
  __in   LPCTSTR lpszSrc
);
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

从SDK文档:

lpszDst
[out]指向接收规范化路径的字符串的指针.您应该将此缓冲区的大小设置为MAX_PATH, 以确保它足够大以容纳返回的字符串.

你没做的.固定:

    StringBuilder builder = new StringBuilder(260);
Run Code Online (Sandbox Code Playgroud)