昆布大好き!

主にプログラミングの技メモ

Haskellコードを動的ライブラリにしてCから使用する その2

つづきです。

ghcで作成したライブラリを呼び出すコードです。

#include <iostream>

extern "C" {
int hslibInit(int argc, char *argv[]);
void hslibEnd();
int exprI(wchar_t *str);
int exprCheck(wchar_t *str);
}

int main(int argc, char *argv[])
{
    int n = 1;
    char *v_[] = {"exe.exe", NULL, };
    char **v = v_;
    hslibInit(n, v);    // hs_initを間接的に呼ぶ

    if ( exprCheck(L"8*3") ) {
        std::cout << exprI(L"8*3") << std::endl;
    }

    hslibEnd();    // hs_exitを間接的に呼ぶ
    return 0;
}

Haskellのコードを実行する前と後に、それぞれhs_initとhs_exit(ghc付属のHsFFI.hに定義)を呼び出します。 ここではこれらをDLLに含んで間接的に呼んでいます。 (HsFFI.hをVCのコンパイラからパスを指定して呼び出すこともなかろうなので)

hslibInitに渡しているのは、Haskellコードが参照するコマンドライン引数のようです。Haskell側のコードで参照していなければ適当なのを渡しても平気です。

プロトタイプ宣言の部分は別途ヘッダファイルにまとめておいた方が便利かと。 あとはこれを、ライブラリを参照してコンパイルすればよいです。