2009年2月7日土曜日

[プログラム]初DLL作成

今日は初めてDLLを作りました。
とりあえず、DLLエクスポート側とインポート側、ヘッダファイルに書くキーワードが違うということを理解するのに時間を要しました。MSDNって一度として役に立ったことがないのよね・・・。あれを理解できないというのはプログラマとしては失格なのかね・・・?
しかし、決まりきった手段(プリプロセッサでもってdefine定義を制御し、1つのヘッダファイルでDLLエクスポート&インポートを実現)があるんだったら、もうシステムに取り込んじゃったらいいのに。あれはVC++オンリーじゃないのかね? それともWindows専用? 地味にめんどいわ。
まーでもこれでDLLの作り方は分かりました。DLLを作るときは、(VC++なら)DLL用のプロジェクトとは別に、そのDLLを呼び出すプロジェクトを用意しておくと開発が楽になりますね。つーかそうするのが普通・・・?^^;
これまであまり同一ワークスペース上に複数のプロジェクトを置いたことがなかったので、割と新鮮。
ただ、今回はちょっとコンポーネントを細かく分けすぎたかも。それぞれをDLLにするほどの意味があるかっちゅーところやなぁ・・・。スタティックリンクにしてしまってもいいんだろうけど、別プロジェクトに分けているときはどないしたらいいかよく分からん・・・。複数DLLにしてしまうと配布が面倒なんだよなぁ。
まぁ、DLLを作ったこと自体が今回初めてなんだし、あまりいろいろな事に手を出すと発散するか。
何はともあれ、ネイティブC++でDLLを作ることができたのは大きな成果。あとはネイティブC++のクラスをC++/CLIでラップして、C#から叩けるようになったらかなり幅が広がるなぁ。複素数演算は(FFTWとかのライブラリを含め)C++は充実してるので、コア演算をC++で書き、GUIをC#で書くという分業が可能になりそう。
あと、C++ならギリギリ、チーム内に展開ができる(笑) C#だと誰も見向きもしてくれないからなぁ。C++でもかなりきわどいラインだけれど^^;
けど最近はピュアCは書いてないんだよなぁ。C++で綺麗にカプセル化を実現できていないときもままあるけど、コンストラクタ&デストラクタの存在はでかい。初期化し忘れとか開放し忘れがかなり減るからなぁ。
ま、DLL作るならピュアCの方がよほど楽なんですけどね^^; おまけにMATLABからも叩けるらしいし・・・。
MATLABから叩くときの注意とかは調べてみようかな。Cの配列を戻り値にするような関数をMATLABから叩いた場合、扱いとしてはどうなるのかってのは気になるところ。そこいらを意識しないと無駄なもの作っちゃうからなぁ。
あぁ、最近Linuxアプリ作ってねぇなぁ(苦笑)