簡體   English   中英

將C ++ / CLI對象指針傳遞給本機對象方法

[英]Passing C++/CLI object pointer to a native object method

我在將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);

救命!

明確表明您的this指針不是IDeckLinkInputCallback類型

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

如您IDeckLinkInputCallback ,您已經在this指針的類中實現了IDeckLinkInputCallback接口。 仔細檢查您是否已完成。 與其從類的成員函數中調用StartCapture更好,不如從外部調用它並提供對象的完整地址而不是this指針。

當期望使用本機指針時,不能僅傳遞托管引用(“帽子指針” ^)。 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
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM