首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从WRL组件获取托管回调

从WRL组件获取托管回调
EN

Stack Overflow用户
提问于 2014-05-09 06:14:20
回答 1查看 867关注 0票数 1

背景(或者,看看我自己走了多远!)

我从Windows 8媒体扩展示例开始。我使用灰度示例作为起点,学习如何将托管代码的值传递给COM对象,以及如何将值从COM对象传递回托管代码。在我的IDL文件中,我得到了一个GrayscaleEffect类(完全取自示例)和一个自定义接口,它应该允许我在c#世界中查询字符串。

IDL文件:

代码语言:javascript
复制
namespace GrayscaleTransform
{
    [version(NTDDI_WIN8), uuid(553B5684-4C22-4D21-8638-1E7D86D84F10)]
    interface MyInterface : IInspectable {
        HRESULT GetMsg([out] HSTRING *message);
    }

    [version(NTDDI_WIN8)]
    runtimeclass GrayscaleEffect {
        interface Windows.Media.IMediaExtension;
        interface MyInterface;
    }
}

我的GrayscaleEffect类实现实现了GetMsg以返回字符串"Woozle“

相关的c#:

代码语言:javascript
复制
cap = new MediaCapture();
await cap.InitializeAsync();

previewElement1.Source = cap;
await cap.StartPreviewAsync();

PropertySet props = new PropertySet();
await cap.AddEffectAsync(
    Windows.Media.Capture.MediaStreamType.VideoPreview,
    "GrayscaleTransform.GrayscaleEffect",
    props);

if (this.props.ContainsKey("ref"))
{
    var augGui = (GrayscaleTransform.MyInterface)this.props["ref"];
    string message;
    augGui.GetMsg(out message);
}

在调用GetMsg之后,我可以看到消息中包含了字符串"Woozle“,就像我期望的那样--太棒了!

问题

现在我想做一些更时尚的事情。与允许我将字符串从COM传递到C#的方法不同,我希望实现一个方法,该方法允许我将委托从C#传递给COM。我想让MFT类每10帧调用一次这个方法--这部分并不重要。我希望我的接口有一个名为SubscribeEvent的方法,它以一个委托作为参数。就目前而言,它可以是一个不带参数的空委托。

此页使我相信,我应该能够在COM世界中声明一个WinRT委托,并且能够从C#传递相同类型的委托(请参阅最后的第3项)。酷-看起来很简单。到目前为止,我最大的努力是在idl中这样做:

代码语言:javascript
复制
delegate void CallbackMethod();

[version(NTDDI_WIN8), uuid(553B5684-4C22-4D21-8638-1E7D86D84F10)]
interface MyInterface : IInspectable {
    HRESULT Subscribe(CallbackMethod cb);
}

不幸的是,这导致了一个错误--似乎与委托CallbackMethod的声明有关:

错误MIDL9008:内部编译器问题-有关如何找到解决方案的建议,请参阅文档。

编辑,,这个很明显。这个语法是C++/cx的东西。仔细检查后,我没有打开C++/CX扩展。这是一个WRL项目,这意味着它是带有模板魔力的常规风味c++。

我还试图通过实现IConnectionPoint接口来连接一个事件,但是当我包含OCIdl.h时,我会得到一个编译错误,即桌面组件不能为ARM编译。

这个问题,,我是不是把树弄错了?我是否应该使用C++/CX使我的GrayscaleEffect类成为一个WinRT运行时类?也许我们在这里冒险进入“新问题”领域,但是当我尝试用C++/CX中的IMFTransform类实现WinRT时,我得到

错误C2811:‘GrayscaleRT::1’无法从'IMFTransform‘继承,ref类只能从ref类或接口类继承。

一个更好的问题:怎么样:我可以在这里传递一个代表吗?我觉得我应该能够,如果我知道神奇的组合WRL模板,使其工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-09 08:01:43

看起来像这就是答案。在WRL中,您在idl中声明一个事件如下:

代码语言:javascript
复制
[uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(NTDDI_WIN8)]
delegate HRESULT WhateverEvent();

请参阅“在计算素数时触发的要添加事件”部分。

我的问题是,最初我不明白我的不是使用c++/cx的。我在WRL中使用了常规的c++,这是一个类似于ATL的模板库,它使WinRT编程更容易,并且不使用非标准语言扩展。

一旦我理解了这一点,就很容易找到一个使用WRL的事件处理程序的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23557779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档