C++/CLI 포인터를 네이티브 C++ 포인터로 변환하는이 문제를 해결했습니다. Heres the background : C++/CLI를 사용하여 Windows 양식 응용 프로그램을 작성하고 있습니다. 응용 프로그램은 여러 COM 인터페이스를 호출합니다. 는 COM 인터페이스를 통해 개체의 (A C++/CLR 클래스의 내부) 인스턴스를 생성 할 때, 내가 같이 CoCreateInstance
에 마지막 인수로 (void**)(&provider)
전달 :C++/CLI 포인터에서 네이티브 C++ 포인터로 변환
HRESULT CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));
그러나
, 내가 컴파일러 오류가 발생합니다 : cli::interior_ptr<Type>
에서 void **
으로 변환 할 수 없습니다. 나는 이것에 대해 som 연구를 해왔고, C++과 C++/CLI에서 포인터의 다른 유형의 문제 인 것처럼 보입니다. 누구나 이것에 대한 지식이 있으며, 해결 방법에 대한 팁이 있습니까? 고맙습니다!
먼저 모든 도움을 주셔서 감사합니다!
Freich가 제안한대로 pin_ptr
을 사용하려고했지만 컴파일러가 interior_ptr
에서 pin_ptr
으로 변환하는 데 문제가 있다고 불평했습니다. 내가 대신과 interior_ptr
를 사용하려고하면 :
pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(CLSID_MSPRProvider, NULL, CLSCTX_LOCAL_SERVER, IID_IMSPRProvider, (void**)pinnedPtr);
나는 interior_ptr
에서 interior_ptr
로 변환 할 수 없습니다 얻을. 이 모든 것은 interior_ptr
을 void**
으로 변환하는 문제로 귀결됩니다. 이와 같이 : (void**)interiorPtr
, 여기서 interiorPtr
은 interior_ptr
입니다. 이것에 대한 아이디어가 있습니까?
이것은 위험한 것 같습니다! 비슷한 (또는 같은) 상황이 발생했습니다 : 고정 된 포인터를 생성하고 네이티브 포인터를 반환했습니다 (함수처럼). 그러나 함수가 끝나고 고정 된 포인터가 삭제 되었기 때문에 개체가 이동되었으므로 개체가 더 이상 필요하지 않습니다. 고정되어 있으며 네이티브 포인터가 유효하지 않습니다! 이것은 디버깅하는 동안 보일 수도 있고 보이지 않을 수도 있지만, 기대하지 않을 때 릴리스 버전에서 발생합니다. –
@TobiasKnauss'std :: string :: string (const char *)'생성자는 참조 된 데이터의 복사본을 생성하므로 함수가 종료 될 때 참조 된 메모리가 더 이상 고정되지 않아도됩니다. –