Pergunta

Em geral, o que precisa ser feito para converter um programa do Windows de 16 bits para Win32? Eu tenho certeza que eu não sou a única pessoa para herdar uma base de código e ser atordoado para encontrar código de 16 bits à espreita nas esquinas.

O código em questão é C.

Foi útil?

Solução

  1. Os significados de wParam e lParam mudaram em muitos lugares. I fortemente encorajá-lo a ser paranóico e convertido, tanto quanto possível usar mensagem crackers . Eles vão poupar nenhum fim das dores de cabeça. Se houver apenas uma parte de conselho que eu poderia dar-lhe, este seria ele.
  2. Enquanto você estiver usando mensagem crackers, também permitem STRICT. Vai ajudá-lo a pegar a base de código Win16 usando int onde deveria estar usando HWND, HANDLE, ou qualquer outra coisa. Convertendo estes vai ajudar muito com # 9 nesta lista.
  3. hPrevInstance é inútil. Certifique-se de que não é usado.
  4. Certifique-se de que você está usando chamadas de Unicode-amigáveis. Isso não significa que você precisa converter tudo para TCHARs, mas significa que é melhor substituir OpenFile, _lopen e _lcreat com CreateFile, para citar o óbvio
  5. LibMain é agora DllMain, e todo o formato e exportação convenções biblioteca são diferentes
  6. Win16 não tinha VMM. GlobalAlloc, LocalAlloc, GlobalFree e LocalFree deve ser substituído com mais equivalentes modernos. Quando terminar, limpar chamadas para LocalLock, LocalUnlock e amigos; eles são agora inútil. Não que eu posso imaginar seu aplicativo fazendo isso, mas certifique-se de não depender de WM_COMPACTING quando você estiver lá.
  7. Win16 também não tinha proteção de memória. Certifique-se de que você não está usando SendMessage ou PostMessage para enviar ponteiros para janelas fora de processo. Você vai precisar para mudar para um mecanismo IPC mais moderno, tais como tubos ou arquivos mapeados na memória.
  8. Win16 também carecia de multitarefa preemptiva. Se você queria uma resposta rápida a partir de outra janela, foi totalmente legal para SendMessage chamada e aguarde a mensagem para ser processado. Isso pode ser uma má idéia agora. Considere se PostMessage não é uma opção melhor.
  9. Pointer e inteiro tamanhos mudança. Lembre-se de verificar cuidadosamente qualquer lugar que você estiver lendo ou escrevendo dados em disco, especialmente se eles são estruturas Win16. Você precisará refazê-las manualmente para lidar com os valores mais curtos. Mais uma vez, o caminho menos doloroso para lidar com isso será usar biscoitos de mensagens sempre que possível. Caso contrário, você precisa caçar manualmente para baixo e convertido int para DWORD e assim por diante, onde aplicável.
  10. Finalmente, quando você tenha pregado o óbvio, considere permitindo verificações de compilação de 64 bits. Muitos dos problemas enfrentados com indo de 16 para 32 bits são o mesmo que vai de 32 a 64, e Visual C ++ é realmente muito inteligente estes dias. Não só você vai pegar algumas questões remanescentes; você vai obter-se pronto para sua eventual migração Win64 também.

Editar : rel Como @ChrisN aponta, o guia oficial para portar Win16 aplicativos para Win32 ainda está disponível, e ambos dá conta e adiciona aos meus pontos acima.

Outras dicas

Além de obter seu ambiente de construção direita, Aqui estão alguns detalhes que você precisa para endereço:

  1. estruturas que contêm ints precisará mudar a curto ou alargar de 16 para 32 bits. Se você alterar o tamanho da estrutura e este é carregado / salvo em disco será necessário código de atualização de arquivos de dados de escrita.

  2. dados por janela é muitas vezes armazenados com o identificador de janela usando GWL_USERDATA. Se você ampliar alguns dos dados para 32 bits, os seus deslocamentos vai mudar.

  3. ponto & TAMANHO estruturas são 64 bits em Win32. Em Win16 eram 32 bits e pode ser devolvido como um DWORD (chamador racharia valor de retorno em dois valores de 16 bits). Isto já não funciona em Win32 (não ou seja Win32 não retornar 64 resultados bit) e as funções foram alteradas para aceitar um ponteiros para armazenar os valores de retorno. Você terá que editar tudo isso. APIs como GetTextExtent são afetados por esta. Este mesmo problema também se aplica a algumas mensagens do Windows.

  4. O uso de arquivos INI é desencorajado em Win32 em favor do registro. Enquanto as funções de arquivo INI ainda trabalho você terá que ter cuidado com as questões Vista. 16 bit programas frequentemente armazenados sua arquivo INI no diretório do sistema do Windows.

Este é apenas algumas das questões que eu posso recordar. Tem sido mais de uma década desde que eu fiz qualquer portabilidade Win32. Uma vez que você se acostuma, é bastante rápido. Cada base de código terá seu próprio "sentir" quando se trata de portabilidade que você vai se acostumar. Você provavelmente vai mesmo encontrar alguns bugs ao longo do caminho.

Há um guia definitivo no artigo Portando 16 Código bits para 32 bits do Windows no MSDN.

O SDK win32 original tinha uma ferramenta que digitalizada código fonte e sinalizado linhas que precisavam ser mudadas, mas eu não me lembro o nome da ferramenta.

Quando eu tive que fazer isso no passado, eu usei uma técnica de força bruta - isto é .: 1 - atualização makefiles ou ambiente de compilação para usar 32 compilador bit e vinculador. Opcionalmente, basta criar um novo projeto no seu IDE (eu uso o Visual Studio), e adicionar os arquivos manualmente.

2 - construção

3 - correção de erros

4 - repetição 2 e 3 até feito

A dor do processo depende do aplicativo que você está migrando. Eu converti 10.000 programas de linha em uma hora, e 75.000 programas de linha em menos de uma semana. Eu também tive alguns pequenos utilitários que eu desisti de e reescreveu (principalmente) a partir do zero.

Eu concordo com Alan que tentativa e erro é provavelmente a melhor maneira.

Aqui estão algumas boas dicas .

concordaram que o compilador provavelmente vai pegar a maioria dos erros. Além disso, se você estiver usando o "próximo" e "longe" ponteiros você pode remover essas designações -. Um ponteiro é apenas um ponteiro em Win32

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top