2014-11-27 3 views
0

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; 
} 

을, 그냥 말해.

도움 주셔서 감사합니다.

+2

호출자는 호출이 완료된 후 BSTR을 파괴합니다. 문자열을 보존하려면 딥 복사해야합니다. –

+1

m_bstFileName을 CComBSTR로 선언하면 할당은 전달 된 BSTR을 복사합니다. –

+0

sizeof가 포인터에서 작동하지 않는다는 것을 기억하십시오[email protected]은 이미 옳은 답을 주었지만, 매뉴얼에 들어가려면'calloc (wcslen (PathName) +1, sizeof * m_bstFileName)'을 써야합니다. – Medinoc

답변

0

문자열을 할당하는 것이 아니라 m_bstFileName에 문자열을 복사해야합니다. 다음과 같이 사용하십시오.

strcpy (m_bstFileName, PathName);

+1

대상 문자열에 충분한 공간을 할당 한 후. –

+1

PayhName을 복사하기 위해 (스택 또는 힙에) 어딘가에 할당하는 것을 잊지 마십시오. – Nathan

1

가장 기본적인 경우 문자열 복사를 수행하기 위해 버퍼를 만들어야합니다. 동일한 작업은 사용중인 프레임 워크에 따라 cstring, ccombstr, std :: string 등으로 할당하여 수행 할 수 있습니다.

+0

버퍼를 잊어 버렸습니다. 내 C++은 녹슬 었어. – Resource

+0

너보다. "m_bstFileName"에 버퍼를 만드는 올바른 방법으로 샘플을 넣으시겠습니까? 이 변수는 런타임에 코드를 통해 변경할 수 있으므로 고정 크기가 아닙니다. 다시 한번 감사드립니다. – MorgoZ