문제

일반적으로 16비트 Windows 프로그램을 Win32로 변환하려면 어떻게 해야 합니까?코드베이스를 물려받고 구석에 숨어 있는 16비트 코드를 발견하고 깜짝 놀란 사람이 나뿐만이 아닐 것이라고 확신합니다.

문제의 코드는 C입니다.

도움이 되었습니까?

해결책

  1. 의 의미 wParam 그리고 lParam 많은 곳에서 바뀌 었습니다. 나 강하게 편집증이되고 가능한 한 많이 전환하도록 격려하십시오. 메시지 크래커. 그들은 당신에게 두통의 끝을 구하지 않을 것입니다. 내가 줄 수있는 조언이 하나만 있다면, 이것이 될 것입니다.
  2. 메시지 크래커를 사용하는 한 STRICT. Win16 코드 기반을 사용하여 잡는 데 도움이됩니다 int 사용해야하는 곳 HWND, HANDLE, 또는 다른 것. 이것들을 변환하면이 목록에서 #9에 큰 도움이됩니다.
  3. hPrevInstance 쓸모가 없습니다. 사용되지 않은지 확인하십시오.
  4. 유니 코드 친화적 인 통화를 사용하고 있는지 확인하십시오. 그렇다고해서 모든 것을 변환해야한다는 의미는 아닙니다 TCHARs이지만 더 잘 교체하는 것을 의미합니다 OpenFile, _lopen, 그리고 _lcreat ~와 함께 CreateFile, 명백한 이름을 지정합니다
  5. LibMain 지금입니다 DllMain, 및 전체 도서관 형식 및 수출 규칙은 다릅니다.
  6. Win16은 VMM이 없었습니다. GlobalAlloc, LocalAlloc, GlobalFree, 그리고 LocalFree 보다 현대적인 등가물로 교체해야합니다. 완료되면 전화를 정리하십시오 LocalLock, LocalUnlock 그리고 친구들; 그들은 이제 쓸모가 없습니다. 당신의 앱이 이것을하는 것을 상상할 수는 없지만 당신이 의지하지 않도록하십시오. WM_COMPACTING 당신이 거기있는 동안.
  7. Win16에는 메모리 보호도 없었습니다. 사용하지 않는지 확인하십시오 SendMessage 또는 PostMessage 프로세스 외 창에 포인터를 보냅니다. 파이프 또는 메모리 매핑 된 파일과 같은보다 최신 IPC 메커니즘으로 전환해야합니다.
  8. Win16은 또한 선제 적 멀티 태스킹이 부족했습니다. 다른 창에서 빠른 답변을 원한다면 전화하는 것이 완전히 시원했습니다. SendMessage 메시지가 처리 될 때까지 기다립니다. 지금은 나쁜 생각 일 수 있습니다. 여부를 고려하십시오 PostMessage 더 나은 옵션이 아닙니다.
  9. 포인터 및 정수 크기 변화. 읽고 있거나 디스크에 데이터를 쓰거나 쓰는 곳 어디에서나 신중하게 확인하십시오. 특히 Win16 구조가있는 경우. 짧은 값을 처리하려면 수동으로 다시 재조정해야합니다. 다시 말하지만, 이것을 다루는 가장 고통스러운 방법은 가능한 경우 메시지 크래커를 사용하는 것입니다. 그렇지 않으면 수동으로 사냥하고 변환해야합니다. int 에게 DWORD 해당되는 곳에서.
  10. 마지막으로, 명백한 것을 못 박았을 때 64 비트 컴파일 체크를 활성화하는 것을 고려하십시오. 16 ~ 32 비트로가는 많은 문제는 32에서 64로 이동하는 것과 동일하며, 요즘 비주얼 C ++는 실제로 똑똑합니다. 당신은 약간의 남은 문제를 포착 할뿐만 아니라; 최종 Win64 마이그레이션에 대한 준비를 할 수 있습니다.

편집하다: @chrisn이 지적했듯이 Win16 앱을 Win32로 포팅하기위한 공식 안내서 여전히 사용할 수 있으며, 두 가지가 모두 위의 내 포인트를 추가합니다.

다른 팁

올바른 빌드 환경을 구축하는 것 외에도 해결해야 할 몇 가지 세부 사항은 다음과 같습니다.

  1. int를 포함하는 구조체는 16비트에서 32비트로 짧게 변경하거나 넓혀야 합니다.구조의 크기를 변경하고 이것이 디스크에 로드/저장되는 경우 데이터 파일 업그레이드 코드를 작성해야 합니다.

  2. 창별 데이터는 GWL_USERDATA를 사용하여 창 핸들과 함께 저장되는 경우가 많습니다.일부 데이터를 32비트로 확장하면 오프셋이 변경됩니다.

  3. POINT 및 SIZE 구조는 Win32에서 64비트입니다.Win16에서는 32비트였으며 DWORD로 반환될 수 있습니다(호출자는 반환 값을 두 개의 16비트 값으로 분할합니다).이는 Win32에서는 더 이상 작동하지 않습니다(예:Win32는 64비트 결과를 반환하지 않음) 및 반환 값을 저장하기 위한 포인터를 허용하도록 함수가 변경되었습니다.이 내용을 모두 편집해야 합니다.GetTextExtent와 같은 API는 이에 영향을 받습니다.이와 동일한 문제는 일부 Windows 메시지에도 적용됩니다.

  4. Win32에서는 레지스트리를 위해 INI 파일을 사용하지 않는 것이 좋습니다.INI 파일 기능이 여전히 작동하는 동안 Vista 문제에 주의해야 합니다.16비트 프로그램은 INI 파일을 Windows 시스템 디렉터리에 저장하는 경우가 많습니다.

이것은 제가 기억할 수 있는 문제 중 일부에 불과합니다.Win32 포팅을 한 지 10년이 넘었습니다.일단 들어가면 꽤 빠릅니다.각 코드베이스에는 익숙해질 포팅에 관한 고유한 "느낌"이 있습니다.도중에 몇 가지 버그를 발견할 수도 있습니다.

이 기사에는 확실한 안내서가 있습니다 16 비트 코드를 32 비트 창으로 포팅합니다 MSDN에서.

원래 Win32 SDK에는 소스 코드를 스캔 한 도구와 변경해야 할 라인을 표시하는 도구가 있었지만 도구의 이름을 기억할 수 없습니다.

과거 에이 작업을 수행해야했을 때, 나는 Brute Force 기술 (예 : 1- MakeFiles를 업데이트하거나 32 비트 컴파일러 및 링커를 사용하여 Build Environment를 사용했습니다. 선택적으로, IDE에서 새 프로젝트를 만들고 (Visual Studio를 사용) 파일을 수동으로 추가하십시오.

2- 빌드

3- 오류 수정

4- 완료 될 때까지 2 & 3을 반복하십시오

과정의 고통은 마이그레이션하는 응용 프로그램에 따라 다릅니다. 1 시간 안에 10,000 개의 라인 프로그램과 일주일 이내에 75,000 개의 라인 프로그램을 전환했습니다. 나는 또한 방금 포기하고 처음부터 다시 쓰는 작은 유틸리티를 가지고있었습니다.

Alan은 시행 착오가 아마도 가장 좋은 방법이라고 동의합니다.

여기 좋은 일이 있습니다 .

컴파일러가 아마도 대부분의 오류를 포착 할 것이라는 데 동의했습니다. 또한 "가까운"및 "Far"포인터를 사용하는 경우 해당 지정을 제거 할 수 있습니다. 포인터는 Win32의 포인터 일뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top