【问题标题】:Passing C++/CLI object pointer to a native object method将 C++/CLI 对象指针传递给本机对象方法
【发布时间】:2018-03-22 21:18:28
【问题描述】:

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

全图如下:

  • 总的来说,我是 C++ 新手(注定要失败)
  • 我正在使用第三方原生 C++ 库来连接 blackmagic IO 显卡。在 API 中有一个非常方便的方法来传递对象的指针,当它们被卡捕获时,该对象将处理帧回调: SetCallback(指向实现接口的对象的指针)。
  • 在上面的 SetCallback(Pointer) 中,我想将指针传递给我的 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);

救命!

【问题讨论】:

  • 您必须声明一个实现该接口的本机 C++ 类。您可以使用 gcroot<ManagedClass>stackoverflow.com/a/2973278/17034 从本机类返回托管代码

标签: c++ c++-cli


【解决方案1】:

明确指出你的this指针不是IDeckLinkInputCallback类型

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

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

【讨论】:

    【解决方案2】:

    当需要本地指针时,您不能只传递托管引用(“帽子指针”^)。 C++/CLI 的全部意义在于可以创建“胶水”代码,例如您缺少的代码。

    基本上,您必须创建一个实现本地接口的本地类,其中可能包含您回调的托管引用。我不熟悉 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
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2023-03-27
      • 1970-01-01
      • 2023-03-09
      • 2010-10-26
      • 2016-09-20
      • 2019-02-07
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多