desmontarlo pieza por pieza ...
myFunction toma un puntero a un puntero de tipo void (que más o menos significa que podría apuntar a cualquier cosa). Podría declararse algo como esto:
myFunction(void **something);
Todo lo que usted pase debe tener ese tipo. Entonces tomas la dirección de un puntero y lo lanzas con (void **) para que sea un puntero vacío. (Básicamente despojarla de cualquier idea acerca de lo que apunta -., Que el compilador podría quejarse de lo contrario)
Esto significa que & variable es la dirección (& hace esto) de un puntero - tan variable es un puntero. ¿A qué? ¡Quién sabe!
Aquí hay un fragmento más completa, para dar una idea de cómo esto encaja:
#include <stdio.h>
int myInteger = 1;
int myOtherInt = 2;
int *myPointer = &myInteger;
myFunction(void **something){
*something = &myOtherInt;
}
main(){
printf("Address:%p Value:%d\n", myPointer, *myPointer);
myFunction((void**)&myPointer);
printf("Address:%p Value:%d\n", myPointer, *myPointer);
}
Si compilar y ejecutar esto, se debe dar a este tipo de salida:
Address:0x601020 Value:1
Address:0x601024 Value:2
Puede ver que myFunction cambió el valor de myPointer, lo que solo pudo hacer porque se pasó la dirección del puntero.
Eso tiene sentido. Pero nunca escuché sobre manejar una variable de un tipo de datos desconocido. ¿Cómo manejaría CoCreateInstance ifaceptr, si no sabe de qué tipo es? en segundo lugar, es el tamaño del vacío arbitrario para el tamaño del tipo de datos original. – numerical25
CoCreateInstance siempre crea un puntero a un objeto COM y lo devuelve a través del parámetro 'void **'. Usted le dice qué tipo desea, en forma del parámetro 'IID_ISomeInterface', y usted es responsable de usar typecasts correctamente para convertir' void ** 'en algo que pueda usar. –
'CoCreateInstance()' "sabe" qué tipo debe ser el puntero de salida según la ID de la interfaz (para eso es 'IID_ISomeInterface' en el ejemplo). Además, ** todos los punteros ** tienen el mismo tamaño para una arquitectura determinada (por ejemplo, todos los punteros en un sistema de 32 bits son 4 bytes, mientras que todos los punteros en un sistema de 64 bits son 8 bytes). No existe el tipo 'void', pero puede tener punteros' void'. Básicamente significa un puntero a cualquier tipo. –