[英]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.