【发布时间】:2011-06-12 06:51:10
【问题描述】:
我有一个用 C++ 编写的 DLL (Player.dll),它在内部使用 Windows GDI。我有一个用 Windows 窗体编写的应用程序(基本上是一个视频播放器),它在内部调用来自 Player.dll 的 API 以使用 p/invoke 技术在屏幕上呈现 实际 图形:
public class ProxyPlayer
{
[DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PlayVideo")]
public static extern void Play(int playerHandle, out TWResult result);
[DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PauseVideo")]
public static extern void Pause(int playerHandle);
//other methods
}
它正在工作。
但是现在,我想使用 Silverlight 4.0 编写相同的应用程序。如您所知,大多数Windows GDI 与HWND 一起在屏幕上渲染图形,这就是我将playerHandle 传递给ProxPlayer 方法的原因,正如您在上面看到的那样。 Window Forms 的UserControl 定义了一个名为Handle 类型为IntPtr 的公共属性,它相当于HWND,所以我将它传递给ProxyPlayer 方法。它解决了我的问题。但 Silverlight 的 UserControl 没有任何此类属性。
所以我的问题基本上是,我将如何处理我的 silverlight 控件?因为没有它,我无法从Player.dll 调用API。但我必须从中调用 APS。我没有任何其他选择,因为 DLL 是真正的引擎,它执行与解释大量数据相关的所有事情,然后渲染它们。因此,请向我推荐符合我要求的解决方案!
注意:假设我的 silverlight 应用程序将始终在 Microsoft Windows 上运行。所以我在调用 Windows GDI 时没有问题。
【问题讨论】:
-
Silverlight 的用户控件没有句柄(与 WPF 相同)。对于 WPF,主窗口有一个,但即使在 Silverlight 中也不是这样,其中内容由其他应用程序(浏览器或 sllauncher)托管
-
@Nawaz:你有没有找到解决问题的方法?我需要和你一样!
-
@Johannes:不。我没有尝试那么多,因为我有一个简单的替代方案:我部署了我的播放器(即作为 winform 应用程序)并要求用户下载它以便播放视频文件。
标签: c# winforms silverlight silverlight-4.0 pinvoke