Указатель функции для классификации проблем функции членства

Васим имеет право, и я также рекомендую вам этот способ, но, возможно, вы захотите попробовать некоторые плагины, такие как:

  • wordpress.org/plugins/php-code-widget/
  • wordpress.org/plugins/allow-php-in-posts-and-pages/
5
задан Rich Seller 21 July 2009 в 20:05
поделиться

2 ответа

Причина "&MyFrameGrabber:: HookFunction" не может быть преобразован в BUF_HOOK_FUNCTION_PTR, то, что, будучи членом класса, он имеет неявно как первый параметр "этот" указатель, таким образом Вы не можете преобразовать функцию членства в не являющуюся членом функцию: эти две подписи выглядят одинаково, но на самом деле отличаются.

Я объявил бы, что интерфейс, определяя функцию, чтобы звонить, иметь Ваш класс реализует его и передает сам объект вместо обратного вызова (можно думать об интерфейсе как об объектно-ориентированной замене указателя функции):

class IHookInterface{
public:
    virtual long HookFunction(long, long, void*) = 0;
};
 class HookClass : public IHookInterface{
public:
    virtual long Hook(long, long, void*) {
        // your code here... 
    }
};

//новое определение: ThirdPartyGrab (..., IHookInterface...);

РЕДАКТИРОВАНИЕ - другое возможное решение в случае, если Вы не можете изменить библиотеку: используйте одиночный элемент, а не статическую функцию.

class HookClass{
public:
    static HookClass& instance(){
        static HookClass _instance;
        return _instance;
    }
    long Hook(long, long, void*) {
        // your code here... 
    }
};

long call_hook(long x,long y,void * z){
    return HookClass::instance().Hook(x,y,z);
}

ВТОРОЕ РЕДАКТИРОВАНИЕ: Вы могли бы немного изменить singleton-класс с методом инициализации для вызова конструктора с надлежащими параметрами, но возможно это не более изящно, чем следующее решение, которое просто:

class HookClass{
public:

    HookClass(string x,string y...){
    }

    long Hook(long, long, void*) {
        // your code here... 
    }
};

static HookClass * hook_instance = 0;

long call_hook(long x,long y,void * z){
    if (0 != hook_instance){
        return hook_instance->Hook(x,y,z);
    }
}

int main(){
    hook_instance = new HookClass("x","y");
    ThirdPartyGrab(..., call_hook, ...);
}
2
ответ дан 14 December 2019 в 01:19
поделиться

Ваш метод члена парламента, не занимающего официального поста имеет неявное this указатель как первый аргумент. Если Вы выписываете это, очевидно, что функциональные подписи не соответствуют.

Необходимо записать статическую функцию членства, которая может быть передана как функция обратного вызова библиотеке. Последний аргумент HookFunction, a void*, смотрит на меня очень как cookie, куда можно передать собственный указатель в.

Так, в целом, это должно быть что-то вроде этого:

class MyClass {
  long MyCallback(long, long) {
    // implement your callback code here
  }

  static long __stdcall ThirdPartyGrabCallback(long a, long b, void* self) {
    return reinterpret_cast<MyClass*>(self)->MyCallback(a, b);
  }
public:
  void StartGrab() {
    ThirdPartyGrab(..., &MyClass::ThirdPartyGrabCallback, ..., this, ...);
  }
};

Это, конечно, только работает если void* аргумент делает то, что я сказал. Положение this в ThirdPartyGrab() вызов должно быть легко найти при наличии полной функциональной подписи включая доступные названия параметра.

7
ответ дан 14 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: