背景(或者,看看我自己走了多远!)!
我从Windows 8媒体扩展示例开始。我使用灰度示例作为起点,学习如何将托管代码的值传递给COM对象,以及如何将值从COM对象传递回托管代码。在我的IDL文件中,我得到了一个GrayscaleEffect类(完全取自示例)和一个自定义接口,它应该允许我在c#世界中查询字符串。
IDL文件:
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#:
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中这样做:
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模板,使其工作。
发布于 2014-05-09 08:01:43
看起来像这就是答案。在WRL中,您在idl中声明一个事件如下:
[uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(NTDDI_WIN8)]
delegate HRESULT WhateverEvent();请参阅“在计算素数时触发的要添加事件”部分。
我的问题是,最初我不明白我的不是使用c++/cx的。我在WRL中使用了常规的c++,这是一个类似于ATL的模板库,它使WinRT编程更容易,并且不使用非标准语言扩展。
一旦我理解了这一点,就很容易找到一个使用WRL的事件处理程序的示例。
https://stackoverflow.com/questions/23557779
复制相似问题