何もしない栞
で、ぶっちゃけ何もしないんだけど、Haskell栞の雛形、とりあえずDLLからHaskellコード呼んで返って来てるぞ、ってのは確認できたので置いとこう。ソースファイルだけだけど、build.bat動かせば、GHCにpath通っていればコンパイルできるはずです。SSPを使ってログを取ってもらえば、204を返しているのが確認できると思います。
で、やってみて引っかかったこと。
- DLLラッパー作りたいだけなら、C++は使わずにCのコードだけで書いた方が楽。GHCはそもそもC++のコードは吐かないし、高級な処理はHaskellで書くんだから中途半端にC++使えても意味無し。というかC++関係で色々トラぶって数時間ロスしました(--;
- defファイル作っておかないと、リンクのときに警告が出て気持ち悪いです。無くても多分動くけど。
- バイナリ大きいのはまあ、コンパイルオプションとかいじればフットプリントはもう少し小さく‥‥なるかもしれない。
- 「__stginit_ShioriCall」ってのがなんかよくわからないマジックワードですが、これは「ルートモジュール」を指定するために利用します。Haskellのイニシャライザはルートモジュールを基点に、そのモジュールが参照しているモジュールとその構造をVMにキャッシュする‥‥、と理解しています。ここでは「ShioriCall」モジュールが基点なので、こーいう名前になります。
- 上の良くわからないマジックワードは、ghcの「-C(大文字のC)」オプションをつけてShioriCall.hsをコンパイルしてみると、Cのコードを吐くので(拡張子hc)、それを覗けばなんとなくわかるかも。
- リクエストで戻ってきているcStrの領域は、単純に「malloc」関数で作られています。なのでC側では「free」で開放すればOK。‥‥だと思うんだけど(--;
まー、ここまでコードがあれば、わかる人はどんどん作っていけるかと。あ、ちなみに文字エンコードは何とかしてください。UTF-8に変換する処理とかは、こちらを参考にさせてもらおうと考えております。
あと、FFI関係はこちらとか、こちらとかを取っ掛かりに、後はGHCのマニュアルページを参考にさせていただきました。私はすごい人たちの知識をとにかく借りまくっております。感謝ですねー。