2008年12月20日土曜日

Win32APIをLazarusでコンパイルできるか(1)

Lazarusが快適に動くようになったので、ちょっと実験。

Win32APIを直接コールしまくってるソースをLazarusでコンパイルできるだろうか。。

Delphiプログラマーには有名なここのサイトこのソースをLazarusでコンパイル。



まあ、コンパイルできない。

ここを見ながらUses句を書き換える。。


LazarusとDelphiの主要なユニットの違い

* Windows->Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)に置き換えます。

LCLはWindowsに限ったものではないので、DelphiのWin32APIに直接アクセスするためのWindowsユニットは、インターフェースに抽象化されてLCLIntfユニットからアクセスするようになります。覚えておいて頂きたいことは、Lazarusはwin32をエミュレートするのではないので、多くの関数が欠落していたり、Win32と同等な働きをしない関数があります。これらの関数はDelphiとの互換性だけのためにあり、とにかく移植するだけのためにあります。LCLは多くの型を利用し、 LCLTypeやVCLGlobalsを必要とします。LCLProcは、FreeThenNilのようなDelphi5以降で導入された便利ないくつかの関数や、コントロールのばめに余分なアンパーサンドを取り除くDeleteAmpersandsのようなものを含みます。 Interfacesユニットは、適切なwidgetsetを初期化するための.lprファイルをインクルードするために必要です。

* Messages->LMessagesに置き換えます。

Delphiでは、TControlメッセージ(Win32イベントコールバックでは、WM_CALLBACK形式になっています。)とそれらに関連するメッセージはMessageユニットにあります。 LCLでは、これらの型やメッセージ、構造体などの定義は、LMessagesユニットにあります。大抵の場合、WM_MOUSEENTER は LM_MOUSEENTER に、TWMMouse は TLMMouseに、といった具合に、WMをLMに変更されています。


うむ。上手くいかない。

問題は僕自身がWin32APIをあまり理解していないことだなあ。。
VCLばっかり使ってるからな。。
まあいい勉強になると思うので、しばらく格闘してみようと思います。

0 件のコメント:

コメントを投稿