2008-09-29 13 views
15

Co należy zrobić, aby przekonwertować 16-bitowy program Windows na Win32? Jestem pewien, że nie jestem jedyną osobą, która odziedziczy bazę kodów i jest oszołomiona, aby znaleźć 16-bitowy kod czający się w rogach.Konwersja kodu Win16 C na Win32

Kod w pytaniu C.

+0

jaki to rodzaj aplikacji? –

+0

Znalazłem kilka w naszym kodzie; większość to symulatory z prostymi GUI. Najważniejsza jest komunikacja szeregowa do rozmów z urządzeniami wbudowanymi.Ma również GUI. – Zathrus

+0

Wow ... Bardzo mi przykro z tego powodu ... Będąc sam mając do czynienia z kodowaniem C czystego Win32 API i próbując zapłakać się do zapomnienia, przynajmniej widzę, że może być o wiele gorzej ...: - / – paercebal

Odpowiedz

15
  1. Znaczniki wParam i lParam zmieniły się w wielu miejscach. I mocno zachęcam do paranoi i konwertuj tak dużo jak to możliwe, aby użyć message crackers. One nie oszczędzą Ci bólu głowy. Jeśli mogę ci doradzić tylko jedną radę, to będzie to.
  2. Dopóki używasz crackerów wiadomości, włącz także STRICT. Pomoże ci to złapać bazę kodu Win16 za pomocą int, gdzie powinno używać HWND, HANDLE lub czegoś innego. Konwersja tych będzie znacznie pomóc z # 9 na tej liście.
  3. hPrevInstance jest bezużyteczny. Upewnij się, że nie jest używany.
  4. Upewnij się, że używasz połączeń przyjaznych dla Unicode. To nie znaczy, trzeba konwertować wszystko TCHAR s, ale oznacza, że ​​lepiej zastąpić OpenFile, _lopen i _lcreat z CreateFile, aby wymienić oczywiste
  5. LibMain jest teraz DllMain, a cała biblioteka konwencje formatowania i eksport są różne
  6. Win16 nie miał VMM. GlobalAlloc, LocalAlloc, GlobalFree i LocalFree należy zastąpić nowszymi odpowiednikami. Po zakończeniu oczyść połączenia pod numerami LocalLock, LocalUnlock i znajomymi; teraz są bezużyteczne. Nie mogę sobie wyobrazić, że twoja aplikacja to robi, ale upewnij się, że nie polegasz na WM_COMPACTING, gdy tam jesteś.
  7. Win16 również nie miał ochrony pamięci. Upewnij się, że nie używasz SendMessage lub PostMessage do wysyłania wskaźników do okien poza procesem. Musisz przejść do bardziej nowoczesnego mechanizmu IPC, takiego jak potoki lub pliki mapowane w pamięci.
  8. Win16 również brakowało wielozadaniowości zapobiegawczej. Jeśli chcesz uzyskać szybką odpowiedź z innego okna, fajnie jest zadzwonić pod numer SendMessage i poczekać, aż wiadomość zostanie przetworzona. To może być teraz zły pomysł. Zastanów się, czy PostMessage nie jest lepszą opcją.
  9. Zmienia się rozmiar wskaźnika i liczby całkowitej. Pamiętaj, aby dokładnie sprawdzić, gdziekolwiek czytasz lub zapisujesz dane na dysku —, szczególnie jeśli są to struktury Win16. Będziesz musiał ręcznie je ponowić, aby obsłużyć krótsze wartości. Ponownie, najmniej bolesnym sposobem na poradzenie sobie z tym będzie użycie crackerów wiadomości tam, gdzie to możliwe. W przeciwnym razie musisz ręcznie wyszukać i przekonwertować int na DWORD itd., Jeśli dotyczy.
  10. Wreszcie, gdy już przybiłeś oczywiste rzeczy, rozważ włączenie 64-bitowych sprawdzeń kompilacji. Wiele problemów związanych z przejściem od 16 do 32 bitów jest tym samym, co przejście od 32 do 64, a Visual C++ jest obecnie całkiem sprytny. Nie tylko złapiesz jakieś problemy; Przygotujesz się także na ewentualną migrację Win64.

EDIT: Jak @ChrisN wskazuje the official guide for porting Win16 apps to Win32 jest nadal dostępna, a obie stanowi uzupełnienie się i dodaje do moich powyższych punktów.

1

Oryginalny win32 sdk miał narzędzie, które zeskanowanego kodu źródłowego i oznaczony linie, które musiały zostać zmienione, ale nie pamiętam nazwy narzędzia.

Kiedy musiałem to robić w przeszłości, użyłem techniki brute force - tj .: 1 - zaktualizuj pliki Makefile lub zbuduj środowisko, aby użyć 32-bitowego kompilatora i łącznika. Opcjonalnie, po prostu utwórz nowy projekt w swoim IDE (korzystam z Visual Studio) i dodaj pliki ręcznie.

2 - zbudować

3 - naprawić błędy

4 - powtórzyć 2 & 3, aż zrobił

Ból procesu zależy od aplikacji, migracja. Przekształciłem 10 000 programów liniowych w ciągu godziny i 75 000 programów liniowych w mniej niż tydzień. Miałem też kilka małych narzędzi, które po prostu zrezygnowałem i przepisałem (głównie) od zera.

0

Zgadzam się z Alanem, że próba i błąd to prawdopodobnie najlepszy sposób.

Oto kilka dobrych tips.

0

Uzgodniono, że kompilator prawdopodobnie wykryje większość błędów. Ponadto, jeśli używasz wskaźników "blisko" i "daleko", możesz usunąć te oznaczenia - wskaźnik jest po prostu wskaźnikiem w Win32.

6

Oprócz coraz prawo budować środowisko, Oto kilka specyfika trzeba będzie Adres:

  1. kodowanym zawierające ints będzie trzeba zmienić na krótki lub poszerzyć od 16 do 32 bitów. Jeśli zmienisz rozmiar struktury i zostanie ona załadowana/zapisana na dysku, będziesz potrzebował kodu aktualizacji pliku zapisu.

  2. Dla danych okna jest często przechowywany z uchwytem okna przy użyciu GWL_USERDATA. Jeśli rozszerzysz niektóre dane do 32 bitów, twoje przesunięcia się zmienią.

  3. PUNKT & Struktury SIZE są 64-bitowe w Win32. W Win16 były to 32 bity i mogły zostać zwrócone jako DWORD (wywołujący podzieliłby wartość zwracaną na dwie 16-bitowe wartości). To nie działa już w Win32 (np. Win32 nie zwraca wyników 64-bitowych), a funkcje zostały zmienione tak, aby akceptowały wskaźniki przechowujące wartości zwracane. Będziesz musiał edytować wszystkie te. Interfejsy API, takie jak GetTextExtent, mają na to wpływ. Ten sam problem dotyczy również niektórych wiadomości systemu Windows.

  4. Używanie plików INI jest odradzane w Win32 na korzyść rejestru. Podczas gdy funkcje plików INI nadal działają, musisz być ostrożny przy problemach z Vistą. Programy 16-bitowe często zapisywały swój plik INI w katalogu systemu Windows.

To tylko niektóre z zagadnień, które mogę sobie przypomnieć. Minęło ponad dziesięć lat, odkąd zrobiłem portowanie Win32. Kiedy już to zrobisz, jest dość szybko. Każda baza kodowa będzie miała swoje własne "odczucie", jeśli chodzi o portowanie, do którego się przyzwyczaisz.Prawdopodobnie znajdziesz nawet kilka błędów po drodze.