最近准备做一些Windows Media Services的二次开发,首先自然想到的是找SDK,配置测试环境。期间遇到些问题,搞了好几天算是掌握个大概了。
一、首先是SDK(开发机需要装)。现在已经合并在叫“Windows SDK”的开发包中了。找和你系统对应的就是了。如下面2个:
- Microsoft Windows SDK for Windows 7 and .NET Framework 4
- Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
二、服务器端自然要装Windows Media Services。如果是Server 2003,从添加/删除程序里的添加功能组件里就有了。如果是Server 2008 R2,需要另外下载安装:Windows Media Services 2008 for Windows Server 2008 R2。该服务具体的设置就不说了,不是本文重点。
三、参考微软网站上的开发指南,在开发机上编写如下代码连接服务器端进行测试:
try { Type tServerType; Guid clsid = new Guid("{845FB959-4279-11D2-BF23-00805FBE84A6}"); WMSServer RemoteServer; // Retrieve the type information from the Windows // Media server running on the remote machine. tServerType = Type.GetTypeFromCLSID(clsid, "YourServerName", true); if (tServerType != null) { // Create an instance of the remote server object locally. RemoteServer = (WMSServer)Activator.CreateInstance(tServerType); AddMessage("当前客户端连接数:" + RemoteServer.Players.Count); } else AddMessage("Cannot create WMSServer"); } catch (COMException comExc) { AddMessage(comExc.Message); } catch (Exception ex) { AddMessage(ex.Message); }
这段代码是在开发机上建立一个(连接到WMS服务器的)远程对象,取得当前连接的播放机数量。若客户端和WMS服务都在一台机上,这段代码运行通常都没问题。但现在是引用远程对象,因此需要作一些配置,否则很可能会出现0x800706ba或0x80070005的COM+错误。
四、上述的错误其实关键就是DCOM权限问题。这里讨论开发机和服务器均不在域环境下的情况。若都加入了域,其配置也是类似的。但开发机没加入域,服务器在域环境下的情况我还没法设置成功。要想成功创建远程DCOM对象,需要以下设置:
- 现假设开发机上的登录账号为账号A ,则服务器上需要有一个和账号A相同登录名和密码的账号B。
- 将账号B加入到服务器本地用户组中的Distributed COM Users组。
- 打开服务器管理工具中的“组件服务”,依次打开“组件服务-计算机-我的电脑-DCOM 配置-Windows Media Services”,双击或右键打开属性框,选中“安全”选项卡。在“启动和激活权限”、“访问权限”里加入账号B。(Windows Server 2008 R2中属性框里的选项无法修改的话可以看这里:Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法)
至此开发机应该已经可以远程创建服务器对象了。但要正常进行类型转换(将创建的object对象强制转换为WMSServer对象),开发机还需注册一下类型库。在命令行下执行:
regsvr32 “C:\Program Files\Reference Assemblies\Microsoft\WindowsMediaServices\v9.6\WMSServerTypeLib.dll”
来注册类型库。注册时可能因为版本问题会注册失败。若失败可以将服务器上的库文件来复制过来注册。默认是在:C:\WINDOWS\system32\windows media\server文件夹下。
后注:据观察和网上的搜索。0x800706ba错误多是根本连接不上服务器上的DCOM组件。可能是服务没开,可能是没相关的登录账号等。而0x80070005则是连上的账号对该DCOM组件来说没有启动、访问权限,需要在“组件服务”里设置一下。