Diferencia entre LPVOID y void *

¿Puedo usar void* lugar de LPVOID en C?

O LPVOID realiza alguna funcionalidad especial que void* .

No hay ningún tipo de LPVOID en C, es una cosa de Windows.

Y la razón por la que existe este tipo de cosas es para que los tipos subyacentes puedan cambiar de una versión a otra sin afectar su código fuente.

Por ejemplo, digamos que las primeras versiones del comstackdor C de Microsoft tenían un int 16 bits y un long 32 bits. Simplemente podrían usar:

 typedef long INT32 

y, voila, tienes tu tipo entero de 32 bits.

Ahora avancemos unos años hasta un momento en que Microsoft C usa un int 32 bits y un long 64 bits. Para seguir teniendo su función de código fuente correctamente, simplemente cambian la línea typedef para leer:

 typedef int INT32 

Esto contrasta con lo que tendría que hacer si usara long para sus tipos de enteros de 32 bits. Tendría que revisar todo su código fuente y asegurarse de cambiar sus propias definiciones.

Es mucho más limpio desde el punto de vista de la compatibilidad (compatibilidad entre diferentes versiones de Windows) utilizar los tipos de datos de Microsoft.

En respuesta a su pregunta específica, probablemente esté bien usar void* lugar de LPVOID siempre que no se LPVOID que la definición de LPVOID cambie.

Pero no lo haría, por si acaso. Nunca se sabe si Microsoft podría introducir alguna forma diferente de manejar punteros generics en el futuro que cambiaría la definición de LPVOID . Realmente no se pierde nada al usar el tipo de Microsoft, pero se le podría solicitar que haga un trabajo en el futuro si cambian la definición y usted decide usar el tipo subyacente.

Es posible que no piense que los punteros serían inmunes a este tipo de cambio pero, en los 8088 días originales en que se creó Windows, había todo tipo de rarezas con punteros y modelos de memoria (pequeña, pequeña, grande, enorme, etc.) que permitían los punteros. para ser de diferentes tamaños, incluso dentro del mismo entorno.

LPVOID es simplemente un typedef API de Windows para void* .

LPVOID es

 typedef void* LPVOID 

definido en Windef.h donde se Windef.h todos los tipos de datos de Windows.

Podemos usar void * para señalar cualquier tipo.

LPVOID es un puntero a cualquier tipo. Este tipo se declara en WinDef.h de la siguiente manera: typedef void * LPVOID;