繁体   English   中英

从C#调用C ++ COM时变量已损坏

[英]Variable corrupted when calling C++ COM from C#

我正在使用dll从C#代码调用C ++ COM接口。 在C ++端,我有一个WCHAR *全局变量,该变量通过带有BSTR参数的方法进行更新。

问题是,当我第一次从C#调用C ++包装器方法来更改变量时,一切正常,但是当我从C#调用另一个C ++包装器方法时,无法解释的WCHAR *全局变量指向了不同的内存位置它的价值被破坏了。

一些代码:

    //THE C# side:

    capture.filename = PATH + "\\" + DIRECTORY_NAME + "\\";
    capture.MaxMinutesPerFile = MAX_MINUTE_PER_FILE;

“捕获”是C ++包装器类的对象(我认为在将C ++代码构建到DLL时会自动生成。不是我的代码)。 “文件名”属性调用“ put_FileName” C ++方法,“ MaxMinutesPerFile”调用“ put_MaxMinutesPerFile”方法。

//C++ code    

WCHAR *m_bstFileName = L"None";

(...)     

STDMETHODIMP CCaptureMF::put_FileName(BSTR PathName)
{
    EnterCriticalSection(&m_critsec);

   HRESULT hr = S_OK;

   m_bstFileName = PathName;

   LeaveCriticalSection(&m_critsec);
   return hr;
}

STDMETHODIMP CCaptureMF::put_MaxMinutesPerFile(LONG Minutes)
{   

    MaxMinutes= Minutes;

    return S_OK;
}

因此,在调用“ put_FileName”之后,将使用“ PathName”值正确更新“ m_bstFileName”,但是仅在调用“ MaxMinutesPerFile”(或任何其他接口包装器方法)之后,“ m_bstFileName”便会损坏,指向另一个内存位置并已实现有奇怪的数据

谢谢。

编辑:

为了制作“ m_bstFileName”的缓冲区,然后复制“ PathName”数据,我使用了以下代码,请注意“ m_bstFileName”的大小可以在运行时更改:

m_bstFileName = (wchar_t*)malloc(sizeof(PathName));
wcscpy(m_bstFileName, PathName);

该代码可以正常工作,但是该程序的其余部分表现不佳。 我不知道为什么,我应该进行更多调查,但是现在,您能否分析一下这段代码,然后告诉我它是否正确,或者我是否应该以其他方式实现它?

解:

好的,按照您的建议,我终于实现了以下代码,该代码非常适合整个应用程序:

CComBSTR m_bstFileName = L"None";

(...)

STDMETHODIMP CCaptureMF::put_FileName(BSTR PathName)
{
    EnterCriticalSection(&m_critsec);

    HRESULT hr = S_OK;

    m_bstFileName = PathName;

    if (g_pCapture)
    {
        g_pCapture->SetPath(m_bstFileName);
    }
    LeaveCriticalSection(&m_critsec);
    return hr;
}

如果您认为可以更好地实施,请告诉。

谢谢您的帮助!

在最基本的情况下,您需要创建一个缓冲区以将字符串复制到其中。 通过使用cstring,ccombstr,std :: string等进行赋值可以完成相同的操作,具体取决于所使用的框架。

您需要将字符串复制到m_bstFileName,而不仅仅是分配它。 使用类似

strcpy(m_bstFileName,PathName);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM