Я пытаюсь написать класс в DLL, которая использует функцию обратного вызова из другой библиотеки DLL. В настоящее время я могу заставить работать обратный вызов, когда я вызываю его в основной функции, но у меня возникают проблемы при интеграции его в мою собственную DLL.
Я использую Hinstance в обычном проекте и dll im compiling.
Это работает в обычном проекте:
void mycallback(float values[], __int64 timestamp, int status) {
//stuff
globalval[0]=values[0];
...
}
void main(){
...
void(*_callback)(float[], __int64, int);
_callback = &mycallback;
API_CALLBACK finalCallBack = (API_CALLBACK)_callback;
....
//I pass this callback in another function that the api uses later
}
Однако это не удается, когда я пытаюсь перенести его в функцию инициализации в классе, который я компилирую как dll (я пытался использовать функцию связывания, но #include давало мне ошибки (с использованием visual studios 2015)
void MyClass::mycallback(float values[], __int64 timestamp, int status){
//stuff
myClassval[0]=values[0];
...
}
MyClass::Init(){
void(*_callback)(float[], __int64, int);=
_callback = &MyClass::mycallback;<---This line is giving me error
API_CALLBACK finalCallBack = (API_CALLBACK)_callback;
}
Я получаю ошибку "assigning to ' void(*)(float *,long long, int)' from incompaible type 'void(MyClass::*)(float *,long long,int)"
Есть ли другой способ, которым я должен подходить к этому? Я не уверен, как справиться с этим, поскольку у меня есть доступ только к функциям обратного вызова, но не к источнику.
редактировать: я понимаю, что приведение mycallback в качестве статического решит проблему, но тогда я столкнусь с проблемой невозможности сохранить значение где-либо. или есть хороший способ сделать это?
полный код для дальнейшего использования:
void main() {
//declare dll handler
HINSTANCE hinstLib;
FCALL _InitDevices,_ReleaseDevices;
FCALL_GETHMDINFO _getHMDinfo;
FCALL_HMDPRESENT _HMDPresent;
FCALL_STARTTRACKING _StartTracking;
BOOL fFreeResult;
//Load dll
hinstLib = LoadLibrary(TEXT("thirdparty.dll"));
bool* isHMDpresent = new bool;void(*_hmdcallback)(float[], __int64, int);
_hmdcallback = &hmdcallback;
HMD_TRACK_CALLBACK hmdCallBack = (HMD_TRACK_CALLBACK)_hmdcallback;//float handle = (float)hmdCallBack;
//if dll present
if (hinstLib != NULL)
{
//initialise devices
_InitDevices = (FCALL)GetProcAddress(hinstLib, "InitDevices");
if (NULL != _InitDevices)
{
std::cout<<(_InitDevices)()<<std::endl;
}//start tracking
_StartTracking = (FCALL_STARTTRACKING)GetProcAddress(hinstLib, "StartTracking");
if (NULL != _StartTracking)
{
std::cout << (_StartTracking)(hmdCallBack,nullptr,nullptr,nullptr) << std::endl;}
это функция от стороннего dll
DLL_EXPORT typedef void(__stdcall *HMD_TRACK_CALLBACK)(float values[], __int64 timestamp, int status );
Я пытаюсь преобразовать выше и упаковать его в другой DLL (драйвер) с другими функциями из нескольких DLL. Конкретная задача, которую я пытаюсь сделать сейчас, состоит в том, чтобы сохранить массив из обратного вызова библиотеки, которую я использую. В этом случае одна из вещей, которую я сохраняю, values[]
Задача ещё не решена.
Других решений пока нет …