Vincent Trent (FKing)

There is no gene for human spirit

博客园 首页 新随笔 联系 订阅 管理

最近准备做一些Windows Media Services的二次开发,首先自然想到的是找SDK,配置测试环境。期间遇到些问题,搞了好几天算是掌握个大概了。

一、首先是SDK(开发机需要装)。现在已经合并在叫“Windows SDK”的开发包中了。找和你系统对应的就是了。如下面2个:

二、服务器端自然要装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组件来说没有启动、访问权限,需要在“组件服务”里设置一下。

posted on 2012-10-22 17:24  Vincent Trent  阅读(415)  评论(0编辑  收藏  举报