如果以前已经回答过这个问题,请原谅我,但我没有找到适合我的解决方案。我已经看到了许多有关将字符串从C#传递到C ++的答案,但反之则不多。
问题是我有一个C ++应用程序,需要加载C#dll并将其传递给字符串。

在C#方面,我是通过com公开的。

namespace DriverCollect
{

    public interface IDriverInfo
    {

        int GetDriverInfo(ref string name);

    };


    public class DriverInterface:IDriverInfo
    {

        public int GetDriverInfo(ref string drivername)
        {
            DriverInfo myInfo = new DriverInfo(@"c:\logfile.txt") ;

            myInfo.Collect(drivername);
            return 0;
        }
    }
}


我已使用regasm注册tbl文件,这是我在OLE类型的lib查看器中看到的

[
  odl,
  uuid(F3005FE7-DBA1-3FB6-807E-E66626EC875B),
  version(1.0),
  dual,
  oleautomation,
  custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "DriverCollect.IDriverInfo")

]
interface IDriverInfo : IDispatch {
    [id(0x60020000)]
    HRESULT GetDriverInfo(
                    [in, out] BSTR* name,
                    [out, retval] long* pRetVal);
};


在C ++方面,这是我的测试用例。

HRESULT hr = CoInitialize(NULL);

IDriverInfoPtr pDriverInfo(__uuidof(DriverInterface));

if(pDriverInfo)
   m_pDriverInfo = pDriverInfo;

BSTR s(L"c:\\xmltestdir\\cdromarm.sys");
long ret = 1;
hr = m_pDriverInfo->GetDriverInfo(&s,&ret);

CoUninitialize()


;

发生的是,当C#dll收到BSTR时,BSTR始终为空。除此之外,我没有得到任何错误,当函数返回并且HRESULT为S_OK时,ret值被更改。
我尝试过按值传递BSTR也达到相同的效果。

有什么想法吗?

最佳答案

您的BSTR声明时没有长度前缀,因此

BSTR s(L"c:\\xmltestdir\\cdromarm.sys");


尝试这样声明

BSTR s = SysAllocString(L"c:\\xmltestdir\\cdromarm.sys");


here
如果将简单的Unicode字符串作为参数传递给需要BSTR的COM函数,则COM函数将失败。

还可以考虑使用CComBSTR或_bstr_t代替,它在发生异常的情况下可以为您管理内存(从OLE堆中分配和释放)。

关于c# - 将BSTR从 native C++传递到托管C#DLL时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20386123/

10-12 03:50