日期:2014-05-17  浏览次数:21138 次

C#调用ATL写的COM组件的字符串问题
我用ATL写了一个COM组件,接口很简单

interface ICmd : IDispatch{
[id(1)] HRESULT Execute([in] BSTR cmd, [out, retval] BSTR* result);
};

功能实现就是直接返回一个字符串
STDMETHODIMP CCmd::Execute(BSTR cmd, BSTR* result)
{
// TODO: 在此添加实现代码
try
{
if (NULL == result)
{
return E_FAIL;
}

*result = new TCHAR[20];
ZeroMemory(*result, 20);

_tcsncpy(*result, _T("test"), sizeof(_T("test")));
}
catch (...)
{
return E_FAIL;
}

return S_OK;
}


然后我在C#中调用这个函数的时候,报错如下:  “System.Runtime.InteropServices.MarshalDirectiveException”类型的未经处理的异常出现在 mscorlib.dll 中。

其他信息: 封送拆收器限制: 字符串过长。


这是什么原因?怎么处理这个问题啊?各位大牛帮帮忙
c# COM

------解决方案--------------------
引用:
BSTR不是这么操作的吧


*result = new TCHAR[20];
这句错了。

CString s(_T("test"));
*result = s.AllocSysString();

或者:
*result = _bstr_t("test").Detach();

或者:
*result = ::SysAllocString(_T("test"));