Frage

Im Allgemeinen muss was getan wird, um ein 16-Bit-Windows-Programm zu Win32 konvertieren? Ich bin sicher, ich bin nicht die einzige Person, die eine Code-Basis zu erben und betäubt werden 16-Bit-Code zu finden, in den Ecken lauern.

Der betreffende Code ist C.

War es hilfreich?

Lösung

  1. Die Bedeutung von wParam und lParam hat an vielen Stellen verändert. I stark ermutigen Sie paranoid zu sein und so viel wie möglich zu konvertieren Nachricht Cracker verwenden . Sie werden Ihnen kein Ende der Kopfschmerzen sparen. Wenn es nur ein Ratschlag ist, den ich Ihnen geben könnte, das wäre es.
  2. Solange Sie Nachricht Cracker verwenden, auch STRICT ermöglichen. Es wird Ihnen helfen, die Win16-Codebasis fangen int verwenden, wo sollte es HWND, HANDLE, oder etwas anderes werden. Diese Umwandlung wird stark mit # 9 in dieser Liste helfen.
  3. hPrevInstance ist nutzlos. Stellen Sie sicher, dass es nicht verwendet wird.
  4. Stellen Sie sicher, dass Sie mit Unicode-freundliche Anrufe. Das bedeutet nicht, dass Sie alles zu TCHARs konvertieren müssen, sondern bedeutet, dass Sie besser ersetzen OpenFile, _lopen und _lcreat mit CreateFile, zu nennen, das Offensichtliche
  5. LibMain ist jetzt DllMain und die gesamte Bibliothek Format und Export Konventionen sind verschiedene
  6. Win16 hatte keine VMM. GlobalAlloc, LocalAlloc, GlobalFree und LocalFree sollten mit moderneren Mitteln ersetzt werden. Wenn Sie fertig sind, aufzuräumen Anrufe LocalLock, LocalUnlock und Freunde; sie sind jetzt nutzlos. Nicht, dass ich Ihre App tun dies vorstellen können, aber stellen Sie sicher, dass Sie nicht auf WM_COMPACTING hängen, während du da bist.
  7. Win16 hatte auch keinen Memory-Schutz. Stellen Sie sicher, dass Sie nicht SendMessage oder PostMessage mit Zeigern auf Out-of-Process-Fenster zu senden. Sie müssen zu einem moderneren IPC-Mechanismus wechseln, wie Rohre oder Memory-Mapped-Dateien.
  8. Win16 fehlte auch preemptives Multitasking. Wenn Sie eine schnelle Antwort von einem anderen Fenster wollten, war es total cool SendMessage anrufen und warten, bis die Nachricht verarbeitet werden. Das mag jetzt eine schlechte Idee sein. Überlegen Sie, ob PostMessage ist nicht eine bessere Option.
  9. Pointer und Integer-Größen ändern. Denken Sie daran, sorgfältig zu prüfen, überall Sie lesen oder Schreiben von Daten auf die Festplatte vor allem, wenn sie Win16 Strukturen sind. Sie müssen manuell wiederholen, die kürzeren Werte zu handhaben. Auch hier wird die am wenigsten schmerzhafte Art und Weise damit zu umgehen sein Nachricht Cracker zu verwenden, wo möglich. Andernfalls müssen Sie manuell jagen und konvertieren int DWORD und so weiter anwendbar, wo.
  10. Wenn Sie schließlich die offensichtliche genagelt haben, sollten Sie 64-Bit-Kompilierung prüft ermöglicht. Viele der konfrontiert Probleme mit 16-32 Bits gehen sind die gleichen wie 32 bis 64 gehen, und Visual C ++ ist eigentlich ziemlich klug in diesen Tagen. Sie werden nicht nur einige verweilende Fragen fangen; erhalten Sie sich bereit für Ihre eventuelle Win64 Migration auch.

Bearbeiten : Wie @ChrisN weist darauf hin, der offizielle Leitfaden für Win16 Portierung apps zu Win32 noch zur Verfügung steht, und beide konkretisiert und ergänzt meine Punkte oben.

Andere Tipps

Neben Ihrer Build-Umgebung richtig hinzubekommen, sind hier einige Besonderheiten müssen Sie Adresse:

  1. structs Ints enthält, müssen kurz ändern oder von 16 auf 32 Bit zu erweitern. Wenn Sie die Größe der Struktur ändern und dies wird geladen / auf Festplatte gespeichert werden Sie Schreibdatendatei Upgrade-Code benötigen.

  2. Per Fensterdaten wird oft mit dem Fenstergriff mit GWL_USERDATA gespeichert. Wenn Sie einen Teil der Daten auf 32 Bit erweitern, wird Ihre Offsets ändern.

  3. POINT & SIZE Strukturen sind 64 Bits in Win32. In Win16 waren sie 32 Bits und könnte als DWORD zurückgegeben werden (Anrufer würde Rückgabewert in zwei 16-Bit-Werte aufgeteilt). Dies funktioniert nicht mehr in Win32 (das heißt Win32 nicht zurück 64-Bit-Ergebnisse) und die Funktionen geändert wurden einen Zeiger zu akzeptieren, die Rückgabewerte zu speichern. Sie müssen alle diese bearbeiten. APIs wie GetTextExtent sind davon betroffen. Das gleiche Problem gilt auch für einige Windows-Meldungen.

  4. Die Verwendung von INI-Dateien wird in Win32 für die Registrierung abgeraten. Während die INI-Datei Funktionen noch arbeiten müssen Sie mit Vista Probleme, vorsichtig sein. 16-Bit-Programme oft ihre INI-Datei im Windows-Systemverzeichnis gespeichert.

Dies ist nur ein paar der Fragen kann ich mich erinnere. Es hat mehr als ein Jahrzehnt her, dass ich jede Win32-Portierung tat. Sobald Sie in sie zu erhalten ist es ziemlich schnell. Jeder Code-Basis wird seine eigene „fühlen“, wenn es um die Portierung kommt, die Sie gewöhnen. Sie werden wahrscheinlich noch ein paar Fehler auf dem Weg finden.

Es gibt eine definitive Anleitung im Artikel 16 Portieren -Bit-Code in 32-Bit-Windows- auf MSDN.

Die ursprüngliche win32 sdk hatte ein Werkzeug, das Source-Code untersucht und markiert Zeilen, die geändert werden müssen, aber ich kann den Namen des Werkzeugs nicht erinnern.

Als ich hatte dies in der Vergangenheit zu tun, habe ich eine Brute-Force-Technik verwendet - d.h .: 1 - Update Makefiles oder Build-Umgebung 32-Bit-Compiler und Linker zu verwenden. Optional gerade ein neues Projekt in Ihrem IDE erstellen (I Visual Studio verwenden) und die Dateien manuell hinzufügen.

2 - build

3 - Fehler beheben

4 - wiederholen 2 & 3 bis done

Der Schmerz des Prozesses hängt von der Anwendung, die Sie migrieren. Ich habe 10.000 Zeilenprogramme in einer Stunde umgesetzt und 75.000 Zeilenprogramme in weniger als einer Woche. Ich habe auch ein paar kleine Programme, die ich einfach aufgegeben auf und schrieb (meist) von Grund auf neu.

Ich bin mit Alan, dass Versuch und Irrtum ist wahrscheinlich der beste Weg.

Hier sind einige gute Tipps .

Vereinbart, dass der Compiler wahrscheinlich die meisten Fehler fangen. Auch, wenn Sie sind „in der Nähe“ und „weit“ Zeiger verwenden, können Sie diese Bezeichnungen entfernen -. ein Zeiger nur ein Zeiger in Win32 ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top