dll을 사용하여 C# 코드에서 C++ COM 인터페이스를 호출하고 있습니다. C++ 측에서 BSTR 매개 변수가있는 메서드를 통해 업데이트되는 WCHAR * 전역 변수가 있습니다.C# COM에서 C# COM을 호출 할 때 변수가 손상되었습니다.
문제는 C#에서 변수를 변경하기 위해 C++ 래퍼 메서드를 호출 할 때 모든 것이 정상적으로 작동하지만 현재 C#에서 다른 C++ 래퍼 메서드를 호출하는 경우 설명 할 수없는 WCHAR * 전역 변수가 가리키는 점입니다. 다른 메모리 위치와 값이 손상됩니다.
일부 코드 :
//THE C# side:
capture.filename = PATH + "\\" + DIRECTORY_NAME + "\\";
capture.MaxMinutesPerFile = MAX_MINUTE_PER_FILE;
"캡처"는 C++ 래퍼 클래스 (. 내가 DLL에 C++ 코드를 만들 때이 자동 생성됩니다 생각하지 내 코드)의 개체입니다. "filename"속성은 "put_FileName"C++ 메서드를 호출하고 "MaxMinutesPerFile"은 "put_MaxMinutesPerFile"메서드를 호출합니다. 그래서, "put_FileName"을 호출 한 후, "m_bstFileName"가 "를 PathName"값을 올바르게 업데이트
//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;
}
하지만, 그냥 "MaxMinutesPerFile"(또는 다른 인터페이스 래퍼 방법)을 호출 한 후, "m_bstFileName는"포인팅을 손상됩니다 다른 메모리 위치로 옮겨져 이상한 데이터로 처리됩니다.
감사합니다.
편집 :
을 :는 "m_bstFileName"버퍼를 확인하고 "를 PathName"데이터를 복사하기 위해 나는 "m_bstFileName"크기 런타임에 변경할 수 있다는 사실을 고려하여 다음과 같은 코드를 사용
m_bstFileName = (wchar_t*)malloc(sizeof(PathName));
wcscpy(m_bstFileName, PathName);
코드는 정상적으로 작동하지만 프로그램의 나머지 부분은 정상적으로 작동하지 않습니다. 왜 더 조사해야하는지 잘 모르겠지만, 지금 당장은 코드 조각을 분석하여 그것이 올바른지 또는 다른 방식으로 구현해야하는지 알려줄 수 있습니까?
해결책 :
좋아, 내가 마지막으로 전체 응용 프로그램에 대해 완벽하게 작동하는 다음 코드를 구현 한 당신의 recomendations을 다음이 더 잘 구현 될 수 있다는 생각한다면
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;
}
을, 그냥 말해.
도움 주셔서 감사합니다.
호출자는 호출이 완료된 후 BSTR을 파괴합니다. 문자열을 보존하려면 딥 복사해야합니다. –
m_bstFileName을 CComBSTR로 선언하면 할당은 전달 된 BSTR을 복사합니다. –
sizeof가 포인터에서 작동하지 않는다는 것을 기억하십시오[email protected]은 이미 옳은 답을 주었지만, 매뉴얼에 들어가려면'calloc (wcslen (PathName) +1, sizeof * m_bstFileName)'을 써야합니다. – Medinoc