在我们项目中,上层是用ASP.NET,低下的子系统提供COM接口供上层调用,在本机上我实现了C#进程内和进程外的COM调用但是,因为各系统在不同的服务器上,所以要用C#调用远程的COM,也就是DCOM,可是我怎么也想不到办法,请众高手帮忙想一想,谁解决了另开贴加分。我刚毕业,第一份工作,还在试用期内,没解决可能位置难保,请大家帮帮了。十万火急,在线等待!

解决方案 »

  1.   

    这个好像不是VC/MFC的问题啊?不懂啊。
      

  2.   

    我在NET技术区也问了,没人回答啊。这也是COM的问题拉
      

  3.   

    你查一下DCOM部署吧!
    因为一旦DCOM部署成功就跟在本地使用COM没有什么两样了.我感觉你既然已经用了C#,好象就没有必要在调用COM了,因为C#就是替代COM的.
      

  4.   

    在Windows95系统下配置DCOM客户端和服务器应用程序   这篇文章是关于如何在Windows95系统下配置DCOM客户端和服务器应用程序的。Windows NT下的配置若有不同,将会特别指出。如果你用NT4,至少要安装Service Pack 3.文章将不涉及如何使用Delphi创建DCOM程序。关于如何运用MIDAS创建多层应用程序的信息,请查阅www.borland.com/midas/technical/
      服务器安装服务器权限可配置为User-Level(用户级)或者Share-Level(共享级)。从控制面板运行"网络-存取控制"就可以察看或者改变配置。
      用户级如果使用有名称验证功能的NT服务器,则选择用户级存取,并指明提供用户和组验证的NT服务器。
      共享级要在没有NT 服务器的条件下使用DCOM,则需要选择共享级存取控制。
      安装DCOM for Win95.在这个地址可以下载:
      http://www.microsoft.com/com/dcom95/download.htm.如果你原来使用用户级控制,需要进行以下步骤:安装DCOMCNFG for Win95.下载地址同上。
      运行DCOMCNFG,选择"默认安全属性"页,点击"编辑默认配置"按钮。在"允许存取"对话框中,将存取权限指配给任何有可能连接服务器应用程序的用户。通常而言,存取权限被指配给"全局".在NT系统中,需要指配给"Everyone(所有人)".选择应用程序,点击"属性"按钮。在Indentity页,选择"交互的用户".也可以指定一个将被允许连接NT系统的用户。
      确认你有SYSTEM账户。
      设置NT机器的Guest账户为有效(在用户管理中)。高亮显示Guest账户,选择菜单项"User|Properties".清除题为"Account Disabled"的选择框。
      添加/改变以下的注册表项(在HKLM\Software\Microsoft\OLE下):EnableRemoteConnect = "Y" LegacyAuthenticationLevel = 1 (DWORD)
      注意:关键字LegacyAuthenticationLevel也可以在DCOMCNFG中改变。
      把以下文件拷贝到\WINDOWS\SYSTEM:DBCLIENT.DLL,STDVCLnn.DLL (如果是Delphi3则为STDVCL32.DLL,如果是Delphi4则用STDVCL40.DLL)。
      同样把这些文件拷贝到\WINDOWS\SYSTEM32目录。
      把服务器应用程序拷贝到本地硬盘(不是网络磁盘)。
      如果服务器应用程序需要存取数据库,则需要进行以下步骤:安装BDE4.0.安装SQL Links.安装数据库服务器(此机器做为数据库服务器)或数据库客户端(此机器作为中间件服务器)。
      Delphi3版本需要把IDPROV32.DLL拷贝到\Program Files\Borland\Common Files\BDE.创建别名。
      拷贝服务器应用程序需要的各种DLL,OCX,运行时组件等等。
      运行服务器应用程序一次以注册到系统。
      如果使用DCOM95 1.0的话,进行以下这个步骤:在"启动"文件夹中添加一个快捷方式,指向RPCSS.EXE.也可在注册表中的下列项增加个启动项:HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices. RPCSS="rpcss.exe"运行服务器应用程序,开始接受客户端请求。在此之前,最好重新启动,保证所有改动生效。
      客户端安装:安装DCOM for Win95.下载地址同上。
      把DBCLIENT.DLL拷贝到\WINDOWS\SYSTEM目录和\WINDOWS\SYSTEM32目录。
      如果使用共享级控制,则在注册表项HKLM\Software\Microsoft\OLE中增加一个DWORD值:
      LegacyAuthenticationLevel = 1.安装客户端应用程序,包括所有需要的文件。
      注一:客户端机器需要有共享级控制或者用户级控制权限。不需要配置共享文件。
      注二:使用early binding时,需要在客户端机器上注册服务器接口。如果使用dispatch接
      口(TremoteServer和TMIDASConnection均使用这种接口),则不需要做其它工作。
      注三:运行客户端应用程序时,Delphi的VCL将会自动注册DBCLIENT和STDVCLnn.
    ----------------------------
      Internet上的DCOM本文描述如何配置在Internet上使用的DCOM(包括防火墙配置)。
      在DCOMCNFG中为服务器和应用程序设置NONE的验证级别为默认值。
      在注册表中作以下改变:HKLM/Software/Microsoft/Rpc/Internet PortsInternetAvailable="Y" UseInternetPorts="Y" Ports="3000-4000"在防火墙中开放135以上端口。
      禁止IP地址翻译。
      注:1) NT Service pack 4将提供DCOM的HTTP通道。
      2) 查阅Mike Nelson关于在防火墙后使用Internet上的DCOM的文章。
      

  5.   

    DCOM要进行一些配置, 
    将 Serv.exe 和 Client.exe 复制到要从中运行该示例的每台计算机上。通过运行带有命令行参数 /RegServer 或 -RegServer(不区分大小写)的 Serv,将该服务器注册到每台计算机上。例如: 
    Serv /RegServer
    (必须注册 Register.dll 以使其工作。)需要将服务器复制到每个客户端的原因是需要在客户端注册服务器的 CLSID 和服务器类型库。 通过使用“控制面板”中的“服务”图标,启动服务器上的服务。 
    在每个客户端上使用 DCOMCNFG(在run中输入DCOMCNFG然后回车),选择 Serv 类的“属性”。从“位置”选项卡中选择“在下列计算机上运行应用程序”,然后输入正在其上运行服务器对象的计算机名称。清除“在此计算机上运行应用程序”复选框。 
    运行 Client 并选择“服务器”。 
    如果连接远程服务器时出现任何问题(例如,如果 Tstcon32.exe 不调用 CoInitializeSecurity),则请在客户端上运行 DCOMCNFG,然后打开“默认属性”选项卡。将“默认身份验证级别”设置为“无”,并将“默认模拟级别”设置为“匿名”。
      

  6.   

    谢谢楼上的两位,找到一点思路了,可是在调用的时候这边ASP页面提示:(我已经按照wangweixing2000(星(准备跳槽中!!)) 设置了属性)拒绝访问。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.UnauthorizedAccessException: 拒绝访问。 ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 {MACHINE}\ASPNET,在 IIS 6 上为网络服务)。如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。 若要授予 ASP.NET 对文件的写访问权,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户,选中所需访问权限对应的框。
      

  7.   

    那就是没有足够权限,想办法配置权限,不过我对ASP.NET 请求的权限设置不太了解!不知你的问题解决了没有呢?
      

  8.   

    我在实现调用进程外的时候按照你说的那样实现了可用我有个问题,就是DCOM调用时,书上说用通过PROXY/STUB才能通过RPC通讯,我觉得这样子简单的设置一下DCONFIG里面的属性为在别的机子上运行,是不是根本行不通的?我用VC做COM的时候通过nmake -f ***ps.mk生成了一个PROXY/STUB,但是我却不知道怎么用它。我曾试用C#引用这个代理DLL,但是提示说不是合法的COM,当然,这只是一个PROXY/STUB,应该不是一个COM。有高手给我讲一下DCOM的调用原理吗?给资料也行还有COM可不可以远程调用COM,怎么利用这个PROXY/STUB建立跟远程COM的通讯?请教啊
      

  9.   

    DCOM远程调用EXE服务器通过设置DCONFIG就可以了,但是这样往往会有权限问题,一般的域内调用可以,如果是广域网使用光DCONFIG是解决不了问题的,服务器和客户端的代码都要做处理,这个以两句就说不清了,你可以参考这方面的例子。DCOM的原理很简单,PROXY/STUB的dll绝大多数情况下实现了和服务器一样的接口,当你请求一个远程接口时,注册表的接口键值下的ProxyStubClsid32子键值是相应的PROXY/STUB的dll的CLSID,所以客户会毫无察觉像使用本地dll一样使用PROXY/STUB,调用列集转发和散集返回由PROXY/STUB自己处理。客户根本不用管PROXY/STUB,原来怎么用组件,现在还是怎么用。这也体现了DCOM的位置透明性。
      

  10.   

    谢谢楼上的,那么是不是不在我做COM的时候就不必要自己去生成PROXY/STUB的DLL了?就按照DCOMCNFG里面设置成在别的计算机上运行就可以了?
    如果要生成,那么我应该怎么处理这个PROXY/STUB的DLL?
    还有,权限问题有具体的建议么?
      

  11.   

    PROXY/STUB的DLL的代码是midl编译器自动生成的,就是那个_p.c文件,不过如果接口是自动化接口或双接口,则会使用通用列集器(ole32.dll),不需要自己的PROXY/STUB DLL,只有当你的街口用到了非ole类型(variant不兼容类型)时,才需要自己的PROXY/STUB DLL,用法很简单,在客户机和服务器注册一下就可以了,组件和客户端代码不用作改动。
    至于广域网内的DCOM调用涉及用户访问权限、激活权限和访问权限,主要是要用到几个函数(CoInitializeSecurity、CoCreateInstanceEx、CoSetProxyBlanket),比较复杂,还是找例子吧。