0

MyClass にこの静的コールバック関数があり、そこから別の静的関数を呼び出そうとします。ただし、Register() が取る引数の 1 つが非静的クラス変数であるという問題があります。

この問題を克服するために「this」キーワードを使用することを考えましたが、できないようです (「this」: 非静的メンバー関数内でのみ参照できます)。これが私のコードです:

class MyClass
{
...
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam);
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK);
    KEYBLOCK *kb;       
...

}
LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    if (wParam == WM_KEYDOWN) 
    {
        MyClass::Register(p->vkCode,this->kb);
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

助言がありますか?

4

3 に答える 3

1

あなたが書いたことを考えると、これ以上の情報なしにこれに答えるのは難しいです.

ただし、 のすべてのインスタンスを処理する必要があると仮定すると、各インスタンスのポインタを for のコンストラクタに配置し、次に のデストラクタに配置MyClassする a を追加して、このリストからを削除することをお勧めします。static std::list<MyClass *>thisMyClassMyClassthis

次に、静的な klHkProc() で、 のすべてのインスタンスの静的リストを反復処理し、のそのような登録されたMyClass各インスタンスの を使用して 1 つの呼び出しごとに繰り返します。MyClass::Register()kbMyClass

これを行うためのコードの大まかな概要は次のとおりです。

class MyClass
{
...
public:
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam);
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK);
    static std::list<MyClass *> allInstances;
    KEYBLOCK *kb;

    MyClass() {
      ...
      allInstances.push_back(this);
      ...
    }
    ~MyClass() {
      ...
      // Assumes not a huge list of instances as this is O(n) and thus destruction
      // of all instances of MyClass in O(n^2) on the number of instances.
      allInstances.remove(this);
      ...
    }

...
};

LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    if (wParam == WM_KEYDOWN)
    {
        std::list<MyClass *> itr = allInstances.begin();
        std::list<MyClass *> end = allInstances.end();
        for (; itr != end; ++itr) {
          MyClass *current = *itr;
          MyClass::Register(p->vkCode, current->kb);
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
于 2012-04-05T16:13:44.253 に答える
0

一般的に言えば、KEYBLOCK *kb が静的でない場合、静的関数内で参照することはできません。「this」ポインターは、オブジェクトのインスタンス内でのみ意味があります。したがって、KEYBLOCK *kb がインスタンス化されたオブジェクト内でのみ意味をなす場合、Register または klHkProc 内で MyClass をインスタンス化する必要があります。呼び出し元を表示するだけでなく、Register が何をすべきかについてより適切なコンテキストを提供してくれれば、後者が Register 内で MyClass をインスタンス化するのに意味があるかどうかを判断するのが簡単になります。

于 2012-04-05T16:16:08.993 に答える
0

静的メンバーと特定のオブジェクト インスタンスの間に暗黙的な接続はありません。

MyClassオブジェクトへのポインタまたは参照を にklHkProc()渡し、それを に渡すことができRegister()ます。

于 2012-04-05T16:13:53.347 に答える