我现在的dll里的函数声明为TCHAR * test(TCHAR *param)
{
    TCHAR * result = new TCHAR[64];
    //...
    return result;
}
这样在dll里new一个字符串,然后返回给C#,可是C#调用这个函数以后,出错:
"0x75b58f09" 指令引用的 "0x00200140" 内存。该内存不能为 "read"。
我猜c#可能试图释放result,结果导致了问题。
请问该如何正确返回一个字符串呢?
最好还能正确释放,没有内存泄露。

解决方案 »

  1.   

    可是不知道为什么C#调完dll以后扔出一个内存不能read的错误啊
    我只能猜测是因为C#不能释放vc在dll里new的char啊
      

  2.   

    直接由C#传一个string进去?
    vc在dll怎么看待这个string呢?看作申请好的char数组?
      

  3.   

    用StringBuilder声明C#端的函数例如
    // ** Documentation for Win32 GetShortPathName() API Function
    // DWORD GetShortPathName(
    //   LPCTSTR lpszLongPath,      // file for which to get short path 
    //   LPTSTR lpszShortPath,      // short path name (output)
    //   DWORD cchBuffer            // size of output buffer
    // );[DllImport("Kernel32", CharSet = CharSet.Auto)]
    static extern Int32 GetShortPathName(
       String path,                // input string
       StringBuilder shortPath,    // output string
       Int32 shortPathLength);     // StringBuilder.Capacity
      

  4.   

    唉,我现在发现好像不是char/string的事儿
    感觉好像是vc里用单例模式创建了一个对象,然后在C#中试图释放的时候除了问题.....
      

  5.   

    试一试这个[DllImport( "zip4_w32.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl )]public static extern [MarshalAs(UnmanagedType.LPStr)]string z4LLkGetKey();
      

  6.   

    你最好在vc的dll里返回值,不要返回地址。