将C ++ / CLI对象指针传递给本机对象方法

时间:2018-03-14 12:23:09

标签: c++ c++-cli

我在将C ++ / CLI对象指针传递给本机对象时遇到了一些麻烦。

整个图片如下:

  • 我是C ++的新手(注定要注定)
  • 我正在使用第三方原生C ++库来连接blackmagic IO视频卡。在API中有一个非常方便的方法来传递对象的指针,该对象将在卡被卡捕获时处理帧回调: SetCallback(指向实现接口的对象的指针)。
  • 在上面的SetCallback(指针)中,我想将指针传递给我的C ++ / CLI对象。当我这样做 我得到:cannot convert argument 4 from 'CLIInterop::Wrapper ^*' to 'IDeckLinkInputCallback *'

我的最终目标是处理从C ++回调到C ++ / CLI的回调,此时将帧传递给WPF(如果我能做到那么远)

调用的代码行是:

从CLIInterop :: Wrapper对象调用

d_Controller->GetDevice()->StartCapture(0, nullptr, true, this);

本机C ++项目中的方法标头:

__declspec(dllexport) bool  DeckLinkDevice::StartCapture(unsigned int videoModeIndex, IDeckLinkScreenPreviewCallback* screenPreviewCallback, bool applyDetectedInputMode, IDeckLinkInputCallback* callbackHandler);

帮助!

2 个答案:

答案 0 :(得分:0)

清楚地表明您的this指针不是类型IDeckLinkInputCallback

d_Controller->GetDevice()->StartCapture(0, nullptr, true, this);
                                                            ^ this pointer is not a type IDeckLinkInputCallback

正如您所说,您已经在IDeckLinkInputCallback指针的类中实现了接口this。仔细检查你是否已经完成了。不要从类的成员函数中调用StartCapture,而是从外部调用它,并提供对象的完整地址,而不是this指针。

答案 1 :(得分:0)

当需要本机指针时,您不能只传递托管引用("帽子指针" ^)。 C ++ / CLI的重点是创建" glue"代码,例如您缺少的内容。

基本上,您必须创建一个实现本机接口的本机类,该接口可能包含您回调的托管引用。我不熟悉BlackMagic视频卡的界面(我以前必须使用DVS视频卡,但他们的软件界面可能难以比较),但这种包装器的一般逻辑类似对此:

class MyDeckLinkInputCallback : IDeckLinkInputCallback
{
public:
    MyDeckLinkInputCallback(CLIInterop::Wrapper^ wrapper)
    {
        _wrapper = wrapper;

        // initialize to your heart's content
    }
private:
    CLIInterop::Wrapper^ _wrapper;

public:
    // TODO implement IDeckLinkInputCallback properly; this is just a crude example
    void HandleFrame(void* frameData)
    {
        // TODO convert native arguments to managed equivalents

        _wrapper->HandleFrame(...); // call managed method with converted arguments
    }
};