パスワードを忘れた? アカウント作成
486228 journal

plustreeの日記: 謎の挙動

日記 by plustree

良くあるように、「インタフェース」と「クラス」を分けて、とあるクラスを定義する。

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)" は未解決です。

なんやそら…。

638087 journal

plustreeの日記: DO_DEVICE_INITIALIZING 恐るべし

日記 by plustree

Windows のデバイスドライバを作って遊んでみた。

IoCreateDevice でデバイスを作成したものの、うまく機能しない。どうやら作成自体には成功しているようだが、まるで機能しない。ディスパッチハンドラに制御が飛んでこない。

似たような機能を実現したサンプルと比較してみたら、DO_DEVICE_INITIALIZING なるフラグが立っているみたい。これが残っていると、きっと OS 君は処理を躊躇するのだろう。

というわけで、DO_DEVICE_INITIALIZING をクリアする方法を必死こいて探してみた。初期化処理を完了するためのカーネル API を。しかし、ない。

さらに調べてみると、なんとこのフラグはドライバで勝手にクリアすればいいらしい。
    DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

ぬぬぬ。してやられた。

675492 journal

plustreeの日記: 宣言

日記 by plustree

一度エントリをクリア。

最近飼いはじめた熱帯魚。
案外照明とかヒーターとか管理面倒なのよねー。

しかも、夏場は暑くなるからヒーターだけでなくクーラー(と言ってもただのファン)の管理もせにゃならんし。

熱帯魚屋に行くとそれなりのグッズはそろっているけど、高いし、設置するにもサイズ合わないしで不満だらけ。

「ないものは作れ」の法則発動ですな。

というわけで、何か作ります。きっと。
サーボ制御はしないけど、PIC は使うでしょう。

typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...