在C#中编组引用IntPtr到BSTR *

我试图调用一个为字符串分配内存的函数,然后用字符串做一些事情。以下是说明问题的基本示例: C ++:
    STDMETHODIMP CFunctionsCollection::Function2 (  
        BSTR leftString, BSTR rightString, BSTR * conString
    )
{
    int leftLen = lstrlen(leftString);
    int rightLen = lstrlen(rightString);

    *conString = new TCHAR[leftLen+rightLen+1];

    for (int i=0 ; i<leftLen ; ++i)
        (*conString)[i] = leftString[i];
    for (int i=0 ; i<rightLen ; ++i)
        (*conString)[leftLen+i] = rightString[i];
    (*conString)[leftLen+rightLen] = 0;

    return S_OK;
}
以下来自C ++程序的调用工作得很好:
BSTR leftString = SysAllocString(L"Left String");
BSTR rightString = SysAllocString(L"Right String");
BSTR conString;
hr = pFunctionsCollection->Function2 ( leftString, rightString, & conString);
C#声明:
Int32 Function2([In, MarshalAs(UnmanagedType.BStr)] String leftString,
                [In, MarshalAs(UnmanagedType.BStr)] String rightString,
                [In, Out] ref IntPtr conStr);
C#电话:
try
{
    String leftString = "Left String"; 
    String rightString = "Right String";
    IntPtr outStr = IntPtr.Zero;
    pFunctionsCollection.Function2(leftString, rightString, ref outStr);
    String outString = Marshal.PtrToStringUni(outStr);
    Console.WriteLine("Out String = {0}", outString);
}
catch (Exception e)
{
    Console.WriteLine("Call to Function2 failed with {0}", e.Message);
}
该计划失败了 调用Function2失败,内存不足,无法继续执行程序。 有谁知道如何从C#进行这样的调用?     
已邀请:
conString是BSTR,必须这样对待。请参阅http://msdn.microsoft.com/en-us/library/ms221069.aspx 您应该使用SysStringLen来获取BSTR的长度 C#中的最后一个参数应该是作为BSTR编组的out字符串 [In,Out,MarshalAs(UnmanagedType.BStr)]输出字符串conStr 您需要使用SysAllocString或SysAllocStringLen为conStr分配内存 项目清单 您无法使用“new”分配内存并将其强制转换为BSTR。 BSTR对您不满意的内存管理和布局有特定要求。您必须始终遵循这些惯例。互操作失败是因为它希望您遵循BSTR的约定,但事实并非如此。     

要回复问题请先登录注册