Me he encontrado con este problema de convertir un puntero C++/CLI a un puntero C++ nativo. Aquí está el fondo: Estoy escribiendo una aplicación de formularios de Windows usando C++/CLI. La aplicación realiza llamadas en varias interfaces COM. Al crear una instancia (en el interior de un C++/clase CLR) de un objeto a través de la interfaz COM, i pase en (void**)(&provider)
como último argumento a CoCreateInstance
, como en:Convertir del puntero C++/CLI al puntero nativo de C++
HRESULT CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));
Sin embargo, consigo el error del compilador: no se puede convertir de cli::interior_ptr<Type>
a void **
. He hecho un poco de investigación sobre esto, y parece que es un problema de diferentes tipos de punteros en C++ y C++/CLI. Alguien tiene algún conocimiento sobre esto, y tal vez un consejo sobre cómo se podría solucionar? Gracias por adelantado!
Primero, gracias por toda ayuda!
Como sugirió Freich, traté de usar el pin_ptr
, pero esto en cambio hizo que el compilador se quejara de los problemas que se convertían de interior_ptr
en pin_ptr
. Si en lugar de tratar de usar la interior_ptr
como en:
pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(CLSID_MSPRProvider, NULL, CLSCTX_LOCAL_SERVER, IID_IMSPRProvider, (void**)pinnedPtr);
consigo no pueden convertir de interior_ptr
a interior_ptr
. Todo se reduce al problema de convertir el interior_ptr
en void**
. De esta manera: (void**)interiorPtr
, donde interiorPtr
por supuesto es un interior_ptr
. Alguna idea en esto?
¡Esto parece ser peligroso! Tuve una situación similar (o la misma) antes: creé un puntero clavado y devolví el puntero nativo (como tú), pero luego el objeto se movió porque la función finalizó y el puntero pinchado fue eliminado, por lo que el objeto ya no estaba inmovilizado y el puntero nativo no es válido Esto puede o no verse durante la depuración, pero seguro que sucederá en su versión de lanzamiento cuando no lo espere. –
@TobiasKnauss el constructor 'std :: string :: string (const char *)' crea una copia de los datos a los que se hace referencia, por lo que está bien si la memoria referenciada ya no está anclada cuando la función finaliza. –