winapi32 una tutorial que c windows winapi 16-bit

una - Convirtiendo el código Win16 C en Win32



winapi32 (6)

En general, ¿qué se necesita hacer para convertir un programa de Windows de 16 bits a Win32? Estoy seguro de que no soy la única persona que hereda una base de código y me sorprendería encontrar código de 16 bits al acecho en las esquinas.

El código en cuestión es C.


Acordé que el compilador probablemente captará la mayoría de los errores. Además, si usa punteros "cercanos" y "lejanos", puede eliminar esas designaciones; un puntero es solo un puntero en Win32.


Además de obtener el entorno de construcción correcto, aquí hay algunos detalles que deberá abordar:

  1. las estructuras que contienen ints necesitarán cambiar a cortas o ensanchadas de 16 a 32 bits. Si cambia el tamaño de la estructura y esta se carga / guarda en el disco, necesitará escribir el código de actualización del archivo de datos.

  2. Por ventana, los datos a menudo se almacenan con el identificador de ventana usando GWL_USERDATA. Si amplía algunos de los datos a 32 bits, sus desplazamientos cambiarán.

  3. Las estructuras POINT & SIZE son 64 bits en Win32. En Win16 eran 32 bits y podían devolverse como DWORD (la persona que llama dividiría el valor de retorno en dos valores de 16 bits). Esto ya no funciona en Win32 (es decir, Win32 no devuelve resultados de 64 bits) y las funciones se cambiaron para aceptar un puntero para almacenar los valores devueltos. Deberá editar todos estos. Las API como GetTextExtent se ven afectadas por esto. Este mismo problema también se aplica a algunos mensajes de Windows.

  4. El uso de archivos INI se desaconseja en Win32 a favor del registro. Si bien las funciones del archivo INI aún funcionan, deberá tener cuidado con los problemas de Vista. Los programas de 16 bits suelen almacenar su archivo INI en el directorio de sistema de Windows.

Estos son solo algunos de los problemas que puedo recordar. Ha pasado más de una década desde que hice cualquier migración de Win32. Una vez que lo entiendes, es bastante rápido. Cada base de código tendrá su propia "sensación" cuando se trata de portar a la que se acostumbrará. Probablemente incluso encuentres algunos errores en el camino.


El sdk win32 original tenía una herramienta que escaneaba el código fuente y las líneas marcadas que necesitaban ser cambiadas, pero no recuerdo el nombre de la herramienta.

Cuando tuve que hacer esto en el pasado, utilicé una técnica de fuerza bruta, es decir: 1 - actualización de archivos make o entorno de compilación para usar el compilador y el enlazador de 32 bits. Opcionalmente, solo crea un nuevo proyecto en tu IDE (uso Visual Studio) y agrega los archivos manualmente.

2 - construir

3 - corregir errores

4 - repite 2 y 3 hasta que termines

El dolor del proceso depende de la aplicación que está migrando. He convertido 10,000 programas de línea en una hora, y 75,000 programas de línea en menos de una semana. También he tenido algunas pequeñas utilidades de las que me di por vencido y reescribí (la mayoría) desde cero.


Estoy de acuerdo con Alan en que la prueba y el error es probablemente la mejor manera.

Aquí hay algunos buenos consejos .



  1. Los significados de wParam y lParam han cambiado en muchos lugares. Le recomiendo encarecidamente que sea paranoico y que convierta tanto como sea posible para usar mensajes de crackers . Ellos te salvarán de dolores de cabeza. Si solo hay un consejo que pueda darte, este sería.
  2. Mientras uses crackers de mensajes, también habilita STRICT . Te ayudará a capturar la base de código de Win16 usando int donde debería estar usando HWND , HANDLE o alguna otra cosa. La conversión de estos será de gran ayuda con el # 9 en esta lista.
  3. hPrevInstance es inútil. Asegúrate de que no se use.
  4. Asegúrate de estar usando llamadas amigables para Unicode. Eso no significa que deba convertir todo a TCHAR s, sino que significa que es mejor reemplazar OpenFile , _lopen y _lcreat con _lcreat , para nombrar lo obvio
  5. LibMain ahora es DllMain y todo el formato de la biblioteca y las convenciones de exportación son diferentes
  6. Win16 no tenía VMM. GlobalAlloc , LocalAlloc , GlobalFree y LocalFree deberían reemplazarse por equivalentes más modernos. Cuando haya terminado, limpie las llamadas a LocalLock , LocalUnlock y amigos; ahora son inútiles. No es que pueda imaginar su aplicación haciendo esto, pero asegúrese de no depender de WM_COMPACTING mientras esté allí.
  7. Win16 tampoco tenía protección de memoria. Asegúrese de no utilizar SendMessage o PostMessage para enviar punteros a ventanas fuera de proceso. Tendrá que cambiar a un mecanismo de IPC más moderno, como tuberías o archivos mapeados en la memoria.
  8. Win16 también carecía de multitarea preventiva. Si quería una respuesta rápida desde otra ventana, era genial llamar a SendMessage y esperar a que se procesara el mensaje. Esa puede ser una mala idea ahora. Considere si PostMessage no es una mejor opción.
  9. El puntero y el tamaño entero cambian. Recuerde verificar cuidadosamente en cualquier lugar que esté leyendo o escribiendo datos en el disco, especialmente si son estructuras Win16. Tendrá que volver a hacerlos manualmente para manejar los valores más cortos. Una vez más, la forma menos dolorosa de lidiar con esto será usar crackers de mensaje cuando sea posible. De lo contrario, deberá buscar manualmente y convertir int a DWORD y así sucesivamente, según corresponda.
  10. Finalmente, cuando haya identificado lo obvio, considere habilitar comprobaciones de compilación de 64 bits. Muchos de los problemas que se enfrentan al pasar de 16 a 32 bits son los mismos que pasar de 32 a 64, y Visual C ++ en realidad es bastante inteligente en estos días. No solo detectará algunos problemas persistentes; también te prepararás para tu eventual migración de Win64.

EDITAR : Como señala @ChrisN, la guía oficial para portar aplicaciones de Win16 a Win32 todavía está disponible, y se desarrolla y se agrega a mis puntos anteriores.