2008-09-29 7 views
15

Im Allgemeinen, was muss getan werden, um ein 16-Bit-Windows-Programm in Win32 zu konvertieren? Ich bin mir sicher, dass ich nicht die einzige Person bin, die eine Codebasis erbt und erstaunt sein muss, dass 16-Bit-Code in den Ecken lauert.Konvertieren von Win16 C-Code nach Win32

Der betreffende Code ist C.

+0

Welche Art von Anwendung ist das? –

+0

Ich habe mehrere in unserer Codebasis gefunden; Die meisten sind Simulatoren mit einfachen GUIs. Der kritische Punkt ist die serielle Kommunikation für das Gespräch mit eingebetteten Geräten.Es hat auch eine GUI. – Zathrus

+0

Wow ... es tut mir sehr leid für dich ... Da ich selbst mit C reinem Win32-API-Code umgehen muss und versuche, mich in Vergessenheit zu versetzen, zumindest, sehe ich, dass es viel schlimmer sein könnte ...: - / – paercebal

Antwort

15
  1. Die Bedeutungen von wParam und lParam haben sich an vielen Stellen geändert. I stark ermutigen Sie, paranoid zu sein und so viel wie möglich zu konvertieren, um message crackers zu verwenden. Sie werden Ihnen ein Ende der Kopfschmerzen ersparen. Wenn es nur einen Rat gibt, den ich Ihnen geben könnte, wäre es das.
  2. Solange Sie Message Cracker verwenden, aktivieren Sie auch STRICT. Es hilft Ihnen, die Win16-Codebasis zu finden, indem Sie int verwenden, wo es HWND, HANDLE oder etwas anderes verwenden soll. Konvertieren dieser wird sehr hilfreich mit # 9 auf dieser Liste.
  3. hPrevInstance ist nutzlos. Stellen Sie sicher, dass es nicht verwendet wird.
  4. Stellen Sie sicher, dass Sie Unicode-freundliche Anrufe verwenden. Das bedeutet nicht, dass Sie alles TCHAR s konvertieren müssen, sondern bedeutet, dass Sie besser OpenFile ersetzen, _lopen und _lcreat mit CreateFile, zu nennen die offensichtliche
  5. LibMain ist jetzt DllMain und die gesamte Bibliothek Format und Export Konventionen sind unterschiedlich
  6. Win16 hatte kein VMM. GlobalAlloc, LocalAlloc, GlobalFree und LocalFree sollten durch modernere Äquivalente ersetzt werden. Wenn Sie fertig sind, bereinigen Sie die Anrufe an LocalLock, LocalUnlock und Freunde; Sie sind jetzt nutzlos. Nicht, dass ich mir vorstellen kann, dass deine App das macht, aber stelle sicher, dass du nicht auf WM_COMPACTING angewiesen bist, während du da bist.
  7. Win16 hatte auch keinen Speicherschutz. Stellen Sie sicher, dass Sie nicht SendMessage oder PostMessage verwenden, um Zeiger auf Out-of-Process-Fenster zu senden. Sie müssen zu einem moderneren IPC-Mechanismus wechseln, z. B. zu Pipes oder Speicherabbilddateien.
  8. Win16 fehlte auch preemptive Multitasking. Wenn Sie eine schnelle Antwort von einem anderen Fenster wollten, war es total cool, SendMessage anzurufen und darauf zu warten, dass die Nachricht verarbeitet wird. Das könnte jetzt eine schlechte Idee sein. Überlegen Sie, ob PostMessage keine bessere Option ist.
  9. Zeiger- und Ganzzahlgrößen ändern sich. Denken Sie daran, überall, wo Sie gerade Daten lesen oder schreiben, sorgfältig zu prüfen, besonders wenn es sich um Win16-Strukturen handelt. Sie müssen sie manuell wiederholen, um die kürzeren Werte zu verarbeiten. Noch einmal, der am wenigsten schmerzhafte Weg, damit umzugehen, wird sein, Nachrichtencracker zu verwenden, wo es möglich ist. Andernfalls müssen Sie manuell suchen und konvertieren int zu DWORD und so weiter, wo anwendbar.
  10. Schließlich, wenn Sie das Offensichtliche genagelt haben, sollten Sie die 64-Bit-Kompilierungsüberprüfung aktivieren. Viele der Probleme, die sich ergeben, wenn man von 16 auf 32 bit geht, sind die gleichen wie von 32 auf 64, und Visual C++ ist heutzutage ziemlich schlau. Sie werden nicht nur einige lang anhaltende Probleme bemerken; Sie werden sich auch für Ihre eventuelle Win64-Migration bereit machen.

EDIT: Wie @ChrisN darauf hinweist, the official guide for porting Win16 apps to Win32 ist noch vorhanden, und beide konkretisiert und fügt oben auf meine Punkte.

1

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

Wenn ich dies in der Vergangenheit tun musste, habe ich eine Brute-Force-Technik - d. H. 1 - Makefiles oder Build-Umgebung zu 32 Bit-Compiler und Linker zu aktualisieren. Erstellen Sie optional ein neues Projekt in Ihrer IDE (ich verwende Visual Studio) und füge die Dateien manuell hinzu.

2 - build

3 - Fehler beheben

4 - wiederholen 2 & 3 bis getan

Der Schmerz des Prozesses hängt von der Anwendung, die Sie migrieren. Ich habe 10.000 Zeilen-Programme in einer Stunde und 75.000 Zeilen-Programme in weniger als einer Woche konvertiert. Ich hatte auch ein paar kleine Utilities, die ich einfach aufgegeben habe und meistens neu geschrieben habe.

0

Ich stimme mit Alan überein, dass Versuch und Irrtum wahrscheinlich der beste Weg ist.

Hier sind einige gute tips.

0

Vereinbart, dass der Compiler wahrscheinlich die meisten Fehler abfangen wird. Wenn Sie "nahe" und "weit" Zeiger verwenden, können Sie diese Bezeichnungen auch entfernen - ein Zeiger ist nur ein Zeiger in Win32.

6

Abgesehen von Ihren Build-Umgebung richtig hinzubekommen, sind hier einige Besonderheiten müssen Sie Adresse:

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

  2. Pro Fenster Daten werden oft mit dem Fensterhandle mit GWL_USERDATA gespeichert. Wenn Sie einige der Daten auf 32 Bits erweitern, ändern sich Ihre Offsets.

  3. POINT & SIZE Strukturen sind 64 Bits in Win32. In Win16 waren sie 32 Bits und konnten als DWORD zurückgegeben werden (der Aufrufer teilte den Rückgabewert in zwei 16-Bit-Werte). Dies funktioniert nicht mehr in Win32 (d. H. Win32 gibt keine 64-Bit-Ergebnisse zurück), und die Funktionen wurden geändert, um Zeiger zum Speichern der Rückgabewerte zu akzeptieren. Sie müssen alle diese bearbeiten. APIs wie GetTextExtent sind davon betroffen. Dasselbe Problem gilt auch für einige Windows-Nachrichten.

  4. Die Verwendung von INI-Dateien wird in Win32 zugunsten der Registrierung abgeraten. Während die Funktionen der INI-Datei weiterhin funktionieren, müssen Sie bei Vista-Problemen vorsichtig sein. 16-Bit-Programme speichern oft ihre INI-Datei im Windows-Systemverzeichnis.

Dies sind nur einige der Punkte, an die ich mich erinnern kann. Es ist über ein Jahrzehnt her, dass ich Win32 portiert habe. Wenn du erst einmal angefangen hast, ist es ziemlich schnell. Jede Codebasis wird ihr eigenes "Gefühl" haben, wenn es um die Portierung geht, an die Sie sich gewöhnen werden.Sie werden wahrscheinlich sogar ein paar Bugs auf dem Weg finden.