コールバック操作を行うサードパーティのライブラリを使用しています。 関数ポインタを取り込む関数を持っています。 問題は、クラスのメンバーである関数へのポインタを渡すことができないことです。コールバック用のメンバー関数ポインタ渡しの場合
私はQtとC++を使用しています。サードパーティのライブラリ関数はC関数のようです。 サードパーティが提供するサンプルコードは、すべてのコードをmainに格納します。 これは望ましくない、私はクラスでコードをラップする必要があります。
このコールバックの問題を解決するにはどうすればよいですか?
A.h
#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();
}
[メンバー関数へのポインタ](http://www.parashift.com/c++-faq-lite/pointers-to-members.html) –
httpを読む://stackoverflow.com/questions/4296281/how-to-pass-member-function-to-a-function-pointer – Lol4t0