Pregunta

En general, ¿qué se debe 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 sorprende ver que el código de 16 bits acecha en las esquinas.

El código en cuestión es C.

¿Fue útil?

Solución

  1. Los significados de wParam y lParam han cambiado en muchos lugares. fuertemente lo aliento a ser paranoico y convertir lo más posible para usar crackers de mensajes . Ellos te salvarán sin fin de dolores de cabeza. Si solo pudiera darte un consejo, este sería el siguiente.
  2. Siempre que use crackers de mensajes, también habilite STRICT . Le ayudará a atrapar la base de código Win16 usando int donde debería estar usando HWND , HANDLE , o algo más. La conversión de estos será de gran ayuda con el número 9 en esta lista.
  3. hPrevInstance no sirve para nada. Asegúrate de que no esté en uso.
  4. Asegúrate de estar usando llamadas amigables con Unicode. Eso no significa que necesite convertir todo a TCHAR s, pero significa que es mejor reemplazar OpenFile , _lopen y _lcreat con CreateFile , para nombrar lo obvio
  5. LibMain ahora es DllMain , y el formato completo de la biblioteca y las convenciones de exportación son diferentes
  6. Win16 no tenía VMM. GlobalAlloc , LocalAlloc , GlobalFree y LocalFree deben 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 que su aplicación haga 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 IPC más moderno, como tuberías o archivos mapeados en memoria.
  8. Win16 también carecía de multitarea preventiva. Si deseaba obtener una respuesta rápida desde otra ventana, fue totalmente genial llamar a SendMessage y esperar a que se procese el mensaje. Esa puede ser una mala idea ahora. Considere si PostMessage no es una mejor opción.
  9. Cambian los tamaños de punteros y enteros. Recuerde verificar cuidadosamente en cualquier lugar donde esté leyendo o escribiendo datos en el disco & # 8212; especialmente si son estructuras Win16. Tendrá que rehacerlos manualmente para manejar los valores más cortos. Nuevamente, la forma menos dolorosa de lidiar con esto será usar crackers de mensajes cuando sea posible. De lo contrario, deberá buscar y convertir manualmente int a DWORD y así sucesivamente, donde corresponda.
  10. Finalmente, cuando haya logrado lo obvio, considere habilitar las comprobaciones de compilación de 64 bits. Muchos de los problemas que se presentan al pasar de 16 a 32 bits son los mismos que los de 32 a 64, y Visual C ++ es bastante inteligente en estos días. No solo captarás algunos problemas persistentes; usted también estará listo para su eventual migración a Win64.

EDIT : como @ChrisN señala, la guía oficial para portar aplicaciones de Win16 a Win32 todavía está disponible, y ambas se despliegan y se agregan a mis puntos anteriores.

Otros consejos

Además de hacer que su entorno de compilación sea el correcto, a continuación le presentamos algunos detalles que deberá abordar:

    Las estructuras
  1. que contengan ints deberán cambiar a corto o ancho de 16 a 32 bits. Si cambia el tamaño de la estructura y se carga / guarda en el disco, necesitará escribir el código de actualización del archivo de datos.

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

  3. PUNTO & amp; Las estructuras de TAMAÑO son de 64 bits en Win32. En Win16 tenían 32 bits y podían devolverse como DWORD (el que llamaba 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 de retorno. Deberá editar todo esto. 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 no se recomienda en Win32 a favor del registro. Mientras que las funciones del archivo INI aún funcionan, deberá tener cuidado con los problemas de Vista. Los programas de 16 bits a menudo almacenaban su archivo INI en el directorio del 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 portabilidad de Win32. Una vez que entras en ella es bastante rápido. Cada código base tendrá su propia "sensación". cuando se trata de portar a lo que te acostumbrarás. Probablemente incluso encuentre algunos errores en el camino.

Hay una guía definitiva en el artículo Porting 16 Código de bits para Windows de 32 bits en MSDN.

El sdk win32 original tenía una herramienta que escaneaba el código fuente y marcaba las líneas que debían cambiarse, pero no recuerdo el nombre de la herramienta.

Cuando he tenido que hacer esto en el pasado, he usado una técnica de fuerza bruta, es decir: 1: actualice los archivos make o los entornos de compilación para utilizar el compilador y el vinculador de 32 bits. Opcionalmente, simplemente cree un nuevo proyecto en su IDE (uso Visual Studio) y agregue los archivos manualmente.

2 - compilación

3 - corregir errores

4 - repite 2 & amp; 3 hasta que termine

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 que renuncié y reescribí (en su mayoría) desde cero.

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

Aquí hay algunos buenos sugerencias .

Convino en que el compilador probablemente detectará la mayoría de los errores. Además, si está utilizando " cerca de " y " lejos " punteros puede eliminar esas designaciones: un puntero es solo un puntero en Win32.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top