2008-08-25 12 views
1

내가 무효 ** 취하는 함수와 오래 된 C 라이브러리가 관리 : I 관리 C에서이 함수를 호출하기 위해 노력하고있어포인터는 C++

oldFunction(void** pStuff); 

를 ++ (m_pStuff는 부모의 구성원 인 형 무효 *의 심판 클래스) :

오류 C2440 : 'static_cast':

oldFunction(static_cast<sqlite3**>( &m_pStuff)); 

이 나에게 다음과 같은 비주얼 스튜디오에서 오류를 제공 Conver 유럽 없다 내가 컴파일러를 추측하고있어

'** 무효'에서 'CLI :: interior_ptr'에서 t은 CLI에 무효 * 회원 포인터로 변환됩니다 :: interior_ptr을 내 뒤로.

어떻게해야합니까?

답변

1

수정 : 수정 된 답변은 아래를 참조하십시오.

정말 당신은 oldFunction이 pStuff로 무엇을 할 것인지를 알아야합니다. pStuff 포인터가 일부 관리되지 않는 데이터에 경우 당신은 함께 m_pStuff의 정의를 포장 시도 할 수 있습니다 :

#pragma unmanaged 

void* m_pStuff 

#pragma managed 

이는 관리되지 않는 함수로 전달 될 수있는 포인터가 관리되지 않는 것. 물론이 포인터에 관리 객체를 직접 할당 할 수는 없습니다.

근본적으로 관리되지 않고 관리되는 포인터가 동일하지 않으며 기본 데이터를 복사하는 일종의 글루 코드 없이는 변환 할 수 없습니다. 기본적으로 관리되는 포인터는 관리되는 힙을 가리키고 이것이 가비지 수집이므로 실제 메모리 주소는 시간이 지남에 따라 변경 될 수 있습니다. 관리되지 않는 포인터는 사용자가 명시 적으로 그렇게하지 않으면 메모리 주소를 변경하지 않습니다.

스크래치를 사용하면 클래스 정의 내부에서 관리되지 않음/관리되지 않는 것을 정의 할 수 없습니다. 그러나이 테스트 코드는 잘 작동하는 것 같다 :

여기
// TestSol.cpp : main project file. 

#include "stdafx.h" 

using namespace System; 

#pragma unmanaged 

void oldFunction(void** pStuff) 
{ 
    return; 
} 

#pragma managed 

ref class Test 
{ 
public: 
    void* m_test; 

}; 

int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 

    Test^ test = gcnew Test(); 
    void* pStuff = test->m_test; 
    oldFunction(&pStuff); 
    test->m_test = pStuff; 

    return 0; 
} 

나는 oldFunction에 의해 그에서 통과 첫째 후 관리되는 개체에서 포인터를 복사합니다. 그런 다음 결과 (아마도 oldFunction에 의해 업데이트 됨)를 관리 객체에 다시 복사합니다. 관리되는 개체는 관리되는 힙에 있으므로 컴파일러는 가비지 수집기가 실행될 때 해당 개체에 포함 된 포인터에 대한 참조를 전달할 수 없도록합니다.

0

조언을 주셔서 감사합니다. 포인터가 C 스타일의 추상 구조입니다. 관리되는 코드에 노출 된 구조를 그대로두면 구조가 정의되지 않아 고통이 더 커질 것입니다. 그래서 내가 할 생각은 C 라이브러리를 C++로 랩핑 한 다음 C++ 래퍼를 관리되는 C++로 랩핑하여 C 구조체를 관리되는 코드에 노출시키지 않도록하는 것입니다.