一般に、16 ビット Windows プログラムを Win32 に変換するには、何をする必要がありますか? コードベースを継承し、隅に潜んでいる 16 ビット コードを見つけて唖然とするのは私だけではないと確信しています。
問題のコードは C です。
wParam
との意味はlParam
多くの場所で変更されています。偏執的になり、可能な限りメッセージクラッカーを使用するように改宗することを強くお勧めします. 彼らはあなたの頭痛の種を救います。一つだけアドバイスするとしたら、これです。STRICT
. 、、またはその他のものint
を使用する必要がある場所を使用して、Win16 コード ベースをキャッチするのに役立ちます。これらを変換すると、このリストの #9 で大いに役立ちます。HWND
HANDLE
hPrevInstance
役に立たない。使用されていないことを確認してください。TCHAR
置き換えて、明白な名前を付けたほうがよいことを意味します。OpenFile
_lopen
_lcreat
CreateFile
LibMain
現在DllMain
は であり、ライブラリ全体の形式とエクスポート規則が異なりますGlobalAlloc
、LocalAlloc
、GlobalFree
、およびLocalFree
は、より現代的な同等のものに置き換える必要があります。LocalLock
完了したら、 、LocalUnlock
および友人への通話をクリーンアップします。それらは今では役に立ちません。あなたのアプリがこれを行っているとは想像できませんが、WM_COMPACTING
そこにいる間は依存しないようにしてください.SendMessage
または送信していないことを確認してください。PostMessage
パイプやメモリ マップ ファイルなど、より最新の IPC メカニズムに切り替える必要があります。SendMessage
してメッセージが処理されるのを待つのは非常にクールでした. それは今では悪い考えかもしれません。PostMessage
より良いオプションではないかどうかを検討してください。int
ますDWORD
。編集: @ChrisN が指摘しているように、Win16 アプリを Win32 に移植するための公式ガイドはアーカイブされており、上記の私のポイントに肉付けして追加します。
ビルド環境を正しくすることとは別に、対処する必要のある詳細をいくつか示します。
intを含む構造体は、shortに変更するか、16ビットから32ビットに拡張する必要があります。構造のサイズを変更し、これがディスクにロード/保存される場合は、データファイルのアップグレードコードを書き込む必要があります。
ウィンドウごとのデータは、多くの場合、GWL_USERDATAを使用してウィンドウハンドルとともに保存されます。一部のデータを32ビットに拡張すると、オフセットが変更されます。
POINT&SIZE構造体はWin32では64ビットです。Win16では、これらは32ビットであり、DWORDとして返すことができました(呼び出し元は戻り値を2つの16ビット値に分割します)。これはWin32では機能しなくなり(つまり、Win32は64ビットの結果を返しません)、関数は戻り値を格納するためのポインターを受け入れるように変更されました。これらすべてを編集する必要があります。GetTextExtentのようなAPIはこれの影響を受けます。この同じ問題は、一部のWindowsメッセージにも当てはまります。
Win32では、レジストリを優先してINIファイルを使用することはお勧めしません。INIファイルの機能は引き続き機能しますが、Vistaの問題に注意する必要があります。16ビットプログラムは、多くの場合、INIファイルをWindowsシステムディレクトリに保存していました。
これは私が思い出すことができる問題のほんの一部です。Win32の移植を行ってから10年以上になります。あなたがそれに入ると、それは非常に速いです。移植に関しては、各コードベースに独自の「感触」があります。途中でいくつかのバグを見つけることさえあるでしょう。
MSDNの記事Porting 16-Bit Code to 32-Bit Windowsに決定的なガイドがありました。
オリジナルのwin32sdkには、ソースコードをスキャンし、変更が必要な行にフラグを立てるツールがありましたが、ツールの名前を思い出せません。
過去にこれを行わなければならなかったとき、私はブルートフォース手法を使用しました-すなわち:1-32ビットコンパイラとリンカを使用するようにmakefilesまたはビルド環境を更新します。必要に応じて、IDEで新しいプロジェクトを作成し(私はVisual Studioを使用します)、ファイルを手動で追加します。
2-ビルド
3-エラーを修正します
4-完了するまで2&3を繰り返す
プロセスの苦痛は、移行するアプリケーションによって異なります。1時間で10,000の回線プログラムを変換し、1週間以内に75,000の回線プログラムを変換しました。また、あきらめて(ほとんど)最初から書き直した小さなユーティリティもいくつかあります。
試行錯誤がおそらく最善の方法であるというアランに同意します。
ここにいくつかの良いヒントがあります。
コンパイラがおそらくほとんどのエラーをキャッチすることに同意しました。また、「near」および「far」ポインタを使用している場合は、これらの指定を削除できます。ポインタは、Win32では単なるポインタです。