plustree (9153) の日記
良くあるように、「インタフェース」と「クラス」を分けて、とあるクラスを定義する。
class INTERFACE1
{
};
class PUBLIC_CLASS1 : public INTERFACE1
{
};
もう一通りインタフェースとクラスを分けて定義するが、こちらは上記のインタフェース/クラスを返すメソッドも定義する。
class INTERFACE2
{
public:
virtual INTERFACE1 *f() = 0;
};
class PUBLIC_CLASS2 : public INTERFACE2
{
public:
virtual PUBLIC_CLASS1 *f();
};
ここまでは何の問題もない。
続いて、PUBLIC_CLASS2 の実体は隠蔽したいなあと思い、さらに派生させて
class PUBLIC_CLASS2 : public INTERFACE2
{
public:
virtual PUBLIC_CLASS1 *f() = 0;
};
class IMPLEMENT_CLASS2 : public PUBLIC_CLASS2
{
public:
virtual PUBLIC_CLASS1 *f();
};
としてみる。これも問題ない。
ちなみに、クラスは DLL でエクスポートしたいので、
class __declspec(dllexport) INTERFACE2
{
public:
virtual INTERFACE1 *f() = 0;
};
class __declspec(dllexport) PUBLIC_CLASS2 : public INTERFACE2
{
public:
virtual PUBLIC_CLASS1 *f() = 0;
};
としておく。これもOK。
と・こ・ろ・が、である。
ちょっと PUBLIC_CLASS1 に手を加え、別のクラス X を使って
class PUBLIC_CLASS1 : public X, public INTERFACE1
{
};
とした瞬間、事態は起こる。
main.obj : error LNK2001: 外部シンボル ""public: virtual class PUBLIC_CLASS1 * __thiscall PUBLIC_CLASS2::f(void)" (?f@PUBLIC_CLASS2@@UAEPAVPUBLIC_CLASS1@@XZ)" は未解決です。
なんやそら…。
- 0 コメント
IntelのオンボードRAIDどころか、SATAすらいまのLinuxは対応してないのかー。
ううう。せっかく買ったディスクをどうしよう。
- 0 コメント
IRP_MJ_READ/WRITE に対しては、irp->IoStatus.Information に読み書きしたバイト数を格納して返さないといけないらしい。
ふむう。
- 0 コメント
Windows のデバイスドライバを作って遊んでみた。
IoCreateDevice でデバイスを作成したものの、うまく機能しない。どうやら作成自体には成功しているようだが、まるで機能しない。ディスパッチハンドラに制御が飛んでこない。
似たような機能を実現したサンプルと比較してみたら、DO_DEVICE_INITIALIZING なるフラグが立っているみたい。これが残っていると、きっと OS 君は処理を躊躇するのだろう。
というわけで、DO_DEVICE_INITIALIZING をクリアする方法を必死こいて探してみた。初期化処理を完了するためのカーネル API を。しかし、ない。
さらに調べてみると、なんとこのフラグはドライバで勝手にクリアすればいいらしい。
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
ぬぬぬ。してやられた。
- 0 コメント
一度エントリをクリア。
最近飼いはじめた熱帯魚。
案外照明とかヒーターとか管理面倒なのよねー。
しかも、夏場は暑くなるからヒーターだけでなくクーラー(と言ってもただのファン)の管理もせにゃならんし。
熱帯魚屋に行くとそれなりのグッズはそろっているけど、高いし、設置するにもサイズ合わないしで不満だらけ。
「ないものは作れ」の法則発動ですな。
というわけで、何か作ります。きっと。
サーボ制御はしないけど、PIC は使うでしょう。
- 0 コメント