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

Passing C++/CLI object pointer to a native object method

本文关键字:对象 本机 方法 指针 C++ CLI      更新时间:2023-10-16

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

整个图片如下:

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

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

调用的代码行是:

从 CLIInterop 调用::包装器对象

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

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

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

帮助!

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

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

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

需要本机指针时,不能只传递托管引用("hat 指针"^(。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
    }
};