Cで書かれたDLLをDから使えるようにする

ちょっと分かってきた気がするので、一応メモ。
(ちなみにC++で書かれたDLLについては分かりません!Cで書かれたもの専用です。)



1: まず対象のDLLと、それを使う為にincludeするヘッダファイル(.h)を準備する。
    (例として hoge.dll、hoge.h とする。)


2: Dの公式から
    ・implib(Basic Utilities) http://www.digitalmars.com/download/freecompiler.html
    ・htod(1.0/2.0) http://www.digitalmars.com/d/1.0/htod.html
             http://www.digitalmars.com/d/2.0/htod.html (同じものかも?)
   を拾ってくる。


3: 2で拾ってきたものを解凍して、
   Dの開発環境( /dm、/dmd )に階層が合うように上書き保存。


4: htodを使って、1のヘッダを変換する。
    ex)>htod hoge.h
   するとヘッダを同じフォルダ内に、同名の.dファイルができる。(この例だとhoge.d)


5: implibを使って、DLLから.libを作る。
    ex)>implib /system hoge.lib hoge.dll
   /systemは呪文。忘れると.lib自体は作れても使用できない。
   hoge.lib は出力名。 DLLと同じ名前 + .lib にしておけば間違いない。
   hoge.dll は1で準備したDLL。 


6: 1のDLLを使ってるサンプルコードなどを何処かから調達して、Dで書き直す。
    (ポインタ部分を直したり、includeをimportにしたり、etc...)


7: 6で書いたコード(仮にmain.dとする)と、
   1で拾ってきたhoge.dll、
   4で作ったhoge.d、
   5で作ったhoge.lib
   をひとつのフォルダに纏めて、ビルドする。
    ex)dmd main.d hoge.h hoge.lib


8: ビルドがこけたら修正して再度ビルド。
   通るまで繰り返す。
   .exeが出来たら実行してみて、動作を確認する。




以上くらいでしょうか。


4のhtodは結構細かい所まで面倒を見てくれる(ヘッダ内のマクロ展開等)ので、
手作業の修正はほんの細かい部分だけで大丈夫では無いかと思われます。


5の/systemは、僕自身が忘れて酷い目を見たので・・・忘れないように!



一応この手順で変換したexpatは使えている(まだバグあると思うけど)ので、
CのDLL使いたいけど、方法が分からない!という方は是非やってみてください。
意外と簡単です。


もし間違い等ございましたら、コメントでも何でも良いので
ご連絡頂けると助かります。