[英]Passing a C++ object pointer to a C++ class through C++/CLI
[英]Passing C++/CLI object pointer to a native object method
我在將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.