我在将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);
帮助!
答案 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
}
};