c++ - 为回调用例传递的成员函数指针

标签 c++ qt

我使用第 3 方库,它执行回调操作。 它有一个接受函数指针的函数。 问题是我无法传递指向作为类成员的函数的指针。

我正在使用 Qt 和 C++。第 3 方库函数似乎是 C 函数。 第三方提供的示例代码将所有代码都放在main中。 这是不可取的,我需要将代码包装在类中。

如何解决这个回调问题?

啊啊

#include "ThirdPartyLibrary.h"
class A
{
public:
    QFile* f;

    A(QString filename);
    ~A();

    bool mount();

    BOOL _stdcall OnWriteCallback
    (
        DRIVE_HANDLE h, 
        ULONGLONG WriteOffset, 
        ULONG WriteSize, 
        const void* WriteBuffer, 
        ULONG *BytesWritten
    );

    BOOL _stdcall OnReadCallback
    (
        DRIVE_HANDLE h, 
        ULONGLONG ReadOffset, 
        ULONG ReadSize, 
        void* ReadBuffer, 
        ULONG *BytesRead
    );
};

A.cpp

A::A(QString filename)
{
    f = new QFile(filename);
    f.open(QFile::ReadWrite);
}

~A::A(){
    f.close();
    delete f;
}

bool A::mount()
{
    //THIS IS THE PROBLEM, CreateVirtualDrive does not take MEMBER FUNCTION POINTERS 
    //properly, instead it wants normal function pointers.
    //CreateVirtualDrive is from an external 3rd-party 
    //library, and seems to be a C function.
    g_hDrive = CreateVirtualDrive(driveLetter,DISK_SIZE,
                                  &A::OnReadCallback,
                                  &A::OnWriteCallback);
}

BOOL _stdcall A::OnWriteCallback
(
    DRIVE_HANDLE h, 
    ULONGLONG WriteOffset, 
    ULONG WriteSize, 
    const void* WriteBuffer, 
    ULONG *BytesWritten
){
    //do some work with QFile f !!
    return true;
}

BOOL _stdcall A::OnReadCallback
(
    DRIVE_HANDLE h, 
    ULONGLONG ReadOffset, 
    ULONG ReadSize, 
    void* ReadBuffer, 
    ULONG *BytesRead
){
    //do some work with QFile f !!
    return true;
}

main.cpp

#include "A.h"
int main ()
{
    A a;
    a.mount();

}

最佳答案

C++ FAQ 中描述了解决此问题的方法:

 class Fred {
 public:
   void memberFn();
   static void staticMemberFn();  // A static member function can usually handle it
   ...
 };

 // Wrapper function uses a global to remember the object:
 Fred* object_which_will_handle_signal;

 void Fred_memberFn_wrapper()
 {
   object_which_will_handle_signal->memberFn();
 }

 int main()
 {
   /* signal(SIGINT, Fred::memberFn); */   // Can NOT do this
   signal(SIGINT, Fred_memberFn_wrapper);  // OK
   signal(SIGINT, Fred::staticMemberFn);   // OK usually; see below
   ...
 } 

关于c++ - 为回调用例传递的成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990449/

相关文章:

linux - Qt中的cmake找不到第三方库,而命令行中的cmake可以

c++ - 我有关于 'already been defined in game.obj'的错误。我该怎么办?

c++ - 从 QObject 中删除动态属性

c++ - 为什么这个自定义类的声明是 Not Acceptable ?

c++ - 用于嵌套 for 循环的 OpenMP?

c++ - 从代码创建的 QPushButton 的最小尺寸/宽度

qt - 有没有办法访问 QWidget 后备存储中的图像?

c++ - 如何在 Qt 应用程序中使用样式表更改 QPushButton 图标大小

c++ - 操作系统编程

c++ - 检查 std::wstring 是 null 还是空