前、使ったDevIL http://www.imagelib.org/
のDポーティングを引っ張り出してきて簡単なプログラムを書いてみた。ilutGLLoadImage(filename)だけでテクスチャ読み込んでOpenGLにセットしてくれるんで結構便利。
ただ、なんか動作が怪しいのでちょっと中断。以下再現する最低限のコード。


private import std.c.stdio;
private import devil;

int main ( char[][]args ){
init();
//ilInit();
printf("exit");
getchar();
return 1;
}
void init(){
ilInit();
ilEnable(IL_CONV_PAL);
//int x=1;
}

initを抜けた所で落ちる。直接main中に書いた場合はOK。ただ、int挟んでも落ちなかったり。典型的なバグ回避コード・・・アセンブラみると、int x=1;が入るとebp,espを操作してる所がenter/leaveになるのが理由みたいだ。
アセンブラ見ても何やってるのかさっぱり。dllの仕組みもどうなってるのか知らないし。なんとか今日中には終わらせておきたい所。


追記1:
関数から戻ってくる時にAccess Violationが発生するんだからebpやespがおかしくなってるはず。元のdll内部では変なことしてないはずだから、dllの関数呼びだす所が怪しい。後はコンパイラのバグとか?
他所で解説されてるようにimplib使って元のdllからlibを作ってるんだけど何故かextern(C)じゃないとリンクできないのが気になる。extern(Windows)は×。dllのソースではWinは__stdcallってなってるからextern(Windows)の方が正しい気がするけど。
http://www.kmonos.net/alang/d/htomodule.html
他のポーティングされてるファイルではversion文で切り分けてるのもあるし、extern(C)だけのもあるみたいなのでどっちでもいいんだろうか。


追記2:
DLLの方を作り直そうと思ったけど依存関係をどう処理すればいいのかわからず。implibとかimpdefを試してみたけどstdcallに必要らしい@の後の数字が出てこない。元のdllにこの情報は含まれてないのか。
で、元のSDKについてるlibを見たらちゃんと@数字がついてるし。呼び出し規則が__stdcallの所を__cdeclで呼び出してたのが原因か?
で、これでいけそう。と思ってDで使えるようにcoff2omfで変換したら@が消えてる…いい加減疲れてきたので残りはまた明日。いざとなったらimpdefで作った.defに@数字を書き足せば多分動くだろう。