Преобразование Win16 C кодирует к Win32

(function(){ var foo = { name: 'bob' }; console.log(foo.name); // bob })(); console.log(foo.name); // Reference error

На самом деле вышеуказанная функция будет рассматриваться как выражение функции без имени.

Основная цель обертывания функции с закрытыми и открытыми круглыми скобками заключается в том, чтобы избежать загрязняя глобальное пространство.

Переменные и функции внутри выражения функции стали частными (т. е. они не будут доступны вне функции.

15
задан Robert Gamble 12 November 2008 в 02:47
поделиться

6 ответов

  1. значения wParam и lParam изменились во многих местах. Я сильно поощряю Вас быть параноиками и преобразовать как можно больше для использования взломщики сообщения . Они сохранят Вас никакой конец головных болей. Если бы существует только один совет, я мог бы дать Вам, это было бы им.
  2. , пока Вы используете взломщиков сообщения, также включите STRICT. Это поможет Вам поймать кодовую базу Win16 с помощью int, где это должно использовать HWND, HANDLE, или что-то еще. Преобразование их значительно поможет с № 9 в этом списке.
  3. hPrevInstance бесполезно. Удостоверьтесь, что это не используется.
  4. Удостоверяются, что Вы используете благоприятные для Unicode вызовы. Это не означает, что Вы должны преобразовать все в TCHAR с, но подразумеваете, что лучше заменяете OpenFile, _lopen, и _lcreat с [1 111], назвать очевидное
  5. LibMain теперь DllMain, и весь формат библиотеки и конвенции экспорта отличающиеся
  6. , Win16 не имел никакого VMM. GlobalAlloc, LocalAlloc, GlobalFree, и LocalFree должен быть заменен более современными эквивалентами. При выполнении очистите вызовы к [1 118], LocalUnlock и друзья; они теперь бесполезны. Не то, чтобы я могу вообразить Ваше приложение, делающее это, но удостовериться, что Вы не зависите от [1 120], в то время как Вы там.
  7. Win16 также не имел никакой защиты памяти. Удостоверьтесь, что Вы не используете SendMessage или PostMessage для отправки указателей на окна из процесса. Необходимо будет переключиться на более современный механизм IPC, такой как каналы или файлы с отображенной памятью.
  8. Win16 также испытал недостаток в вытесняющей многозадачности. Если Вы хотели быстрый ответ от другого окна, было полностью здорово звонить SendMessage и ожидать сообщения, которое будет обработано. Это может быть плохой идеей теперь. Рассмотрите, не является ли PostMessage более оптимальным вариантом.
  9. Указатель и целочисленное изменение размеров. Не забудьте проверять тщательно где угодно, что Вы читаете или пишете данные в disk— особенно, если они - структуры Win16. Необходимо будет вручную восстановить их для обработки более коротких значений. Снова, наименее болезненный способ иметь дело с этим будет состоять в том, чтобы использовать взломщиков сообщения, если это возможно. Иначе необходимо будет вручную выследить и преобразовать int в [1 126] и так далее когда это применимо.
  10. Наконец, когда Вы закрепили очевидное, рассматривают включающие 64-разрядные проверки компиляции. Много проблем, сталкивающихся с движением от 16 до 32 битов, совпадает с движением от 32 до 64, и Visual C++ на самом деле довольно умен в эти дни. Мало того, что Вы поймаете некоторые непрекращающиеся проблемы; Вы подготовитесь к своей возможной миграции Win64, также.
<час>

РЕДАКТИРОВАНИЕ : Как @ChrisN указывает, , официальное руководство для портирования приложений Win16 к Win32 все еще доступно, и оба излагают в деталях и добавляют к моим точкам выше.

15
ответ дан 1 December 2019 в 02:56
поделиться

Существует полное руководство в статье , Портирующей 16-битный код на 32-разрядный Windows на MSDN.

3
ответ дан 1 December 2019 в 02:56
поделиться

Кроме разбирания в Вашей среде сборки, Вот немного специфических особенностей, к которым необходимо будет обратиться:

  1. структуры, содержащие ints, должны будут измениться на короткий или расшириться с 16 до 32 битов. Если Вы изменяете размер структуры, и это загружается/сохраняется в диск, Вы должны будете написать код обновления файла данных.

  2. данные окна Per часто хранятся с дескриптором окна с помощью GWL_USERDATA. При расширении некоторых данных к 32 битам смещения изменятся.

  3. ТОЧКА & структуры РАЗМЕРА составляют 64 бита в Win32. В Win16 они были 32 бита и могли быть возвращены как DWORD (вызывающая сторона разделит возвращаемое значение на два 16 битовых значений). Это больше не работает в Win32 (т.е. Win32 не возвращает результаты на 64 бита), и функции были изменены, чтобы принять, что указатели хранят возвращаемые значения. Необходимо будет отредактировать все их. API как GetTextExtent затронуты этим. Эта та же проблема также относится к некоторым сообщениям Windows.

  4. использованию файлов INI препятствуют в Win32 в пользу реестра. В то время как функции файла INI все еще работают, необходимо будет быть осторожными с проблемами Vista. 16 битных программ часто хранили свой файл INI в системном каталоге Windows.

Это - всего несколько проблем, которые я могу вспомнить. Это было более чем десятилетие, с тех пор как я сделал любое портирование Win32. Как только Вы входите в него, это довольно быстро. Каждая кодовая база будет иметь свое собственное "чувство" когда дело доходит до портирования, к которому Вы привыкнете. Вы, вероятно, даже найдете несколько ошибок по пути.

6
ответ дан 1 December 2019 в 02:56
поделиться

Оригинал win32 sdk имел инструмент, который просканировал исходный код и отметил строки, которые должны были быть изменены, но я не могу помнить название инструмента.

, Когда я должен был сделать это в прошлом, я использовал метод грубой силы - т.е.: 1 - обновляют make-файлы или среду сборки для использования компилятора на 32 бита и компоновщика. Дополнительно, просто создайте новый проект в своем IDE (я использую Visual Studio), и добавьте файлы вручную.

2 - сборка

3 - фиксируют ошибки

4 - повторение 2& 3, пока не сделано

боль процесса зависит от приложения, которое Вы перемещаете. Я преобразовал 10 000 программ строки за час и 75 000 программ строки меньше чем за неделю. У меня также были некоторые маленькие утилиты, от которых я просто разочаровался и переписал (главным образом) с нуля.

1
ответ дан 1 December 2019 в 02:56
поделиться

Я соглашаюсь с Alan, что метод проб и ошибок является, вероятно, лучшим способом.

Вот некоторая польза подсказки .

0
ответ дан 1 December 2019 в 02:56
поделиться

Согласованный, что компилятор, вероятно, зафиксирует большинство ошибок. Кроме того, при использовании "близких" и "далеких" указателей, можно удалить те обозначения - указатель является просто указателем в Win32.

0
ответ дан 1 December 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: