1

我正在尝试在使用来自另一个 dll 的回调函数的 dll 中编写一个类。目前,当我在主函数中调用它时,我可以让回调工作,但我在将它集成到我自己的 dll 中时遇到问题。

我在常规项目和 dll 即时编译中使用 Hinstance。这适用于常规项目:

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;


        }

这是来自第 3 方 dll 的函数

DLL_EXPORT typedef void(__stdcall *HMD_TRACK_CALLBACK)(float values[], __int64 timestamp, int  status );

我正在尝试转换上述内容并将其与来自多个 dll 的其他功能一起打包到另一个 dll(驱动程序)中。我现在要做的具体任务是从我正在使用的 dll 的回调中存储一个数组。在这种情况下,我存储的其中一件事是values[]

4

0 回答 0