急:中间层是DCOM对象,有DLL,有EXE。
问题是我在客户端必须注册这些东西才能运行,有没有不用注册的方法,或是什么方法可以自动注册。把这些服务程序拷贝到客户端运行一下注册有以下问题:这些服务程序是跟数据库打交道的,客户端并无数据连接,执行起来会报错。大家有什么好的方法没有?
如果有什么说的不清楚的地方请大家及时联系。QQ:409808734  MSN:[email protected]
谢谢!

解决方案 »

  1.   

    不懂你在说什么,三层结构中的客户端本来就是瘦的,不会包含多余的Com组件,通常Delphi的客户端需要2个DLL(名字忘记了,三层结构的书上都会介绍的,帮助里面也应该有的),Com组件是存在于服务器端的。最后,给你讲解一下什么是DCOM。DCOM:中文名字是分布式公共对象,望文生义,它的主要目的是实现远程(进程间)的对象互访,他能够让处于不同计算机上的进程实现对象互访。他分成客户端和服务器端。客户端可以象访问普通的Com一样来访问远程Com。Delphi的三层结构可以建立在多种平台上,DCOM是其中一种,delphi的服务器对象还有点特殊的,它可让客户端发现他,其实无非就是在注册表里面多写了一点东西而已。
      

  2.   

    鼓掌!,BlueTrees(蜗牛)大哥说的   好
      

  3.   

    to  dtzfl(蓝猫淘气三千问),你觉得取蜗牛的是大姐吗?那么 难听
      

  4.   

    1、关于注册问题我想我可以了结了,我的回答是不一定需要注册,这取决于你调用自定义接口的方式,在客户端Midas.dll还是最好注册一下,在服务器端必须注册Midas.dll,我研究发现好像delphi中可以把普通调用自动的转换成Idispatch.invoke调用,但是却没有提供从Invoke分解回来的办法,他分解回来依赖于类型库和windowsAPI,这有点奇怪的,或者是我弄错,所以服务器端的类型库要注册的,我以前做过Socket连接的,我把那个讨厌的scksrv合并到了自己的程序中,我发现,这时候其实完全没有必要使用Com的,因为服务器程序完全有能力自己决定装载、缓冲的策略,我很兴奋,我想不需要转换成com,那么可以大大提高服务器端程序的效率和安全性,我在着手做的时候,几乎所有的问题都解决了,包括从socket中提出数据,包括从数据中还原variant变量,但是,我遇到了问题,我没有办法把客户端传来的Invoke数据还原成原来的函数调用,如果手工做,那么几乎是无法完成的任务,因为需要类型信息,即使我在设计程序的时候明确知道类型信息,可以分解invoke包然后静态的指向接口的函数,我也作不到,我没法分解invoke包,MSDN文档对invoke包格式语焉不祥,最后我只好把这个任务交给了windows的API,这个API需要类型库,然后我的程序很悲哀的在资源里面加入了类型库。说实话,我不喜欢Delphi的三层构造的,本来很简单的事情被她搞复杂了,本来通过socket简单传递数据包就好了,他偏要弄对象方式,好像在客户端可以直接用普通函数调用的方式了,不需要在双方的程序中构造通讯类了,结果适得其反,给程序员带来很大的麻烦,系统管理员也够呛,还不如用强制约定的方式传递数据呢,灵活性可以通过合理构造通讯方式获得,这样的安全性高,说实话配置负担很轻。微软都看到了DCOM的弱点,Borland都看不清,咳。在客户端访问方式的影响我总结如下:你在程序中如果使用默认的转换方式,就是,getServer返回的接口你把他存在OLEVariant类型的变量中,然后,用这个变量调用接口方法,那么这种程序方式是需要注册的。    如果,你把GetServer返回的接口存放在IDispatch类型的变量中,并且用强制转换接口的方式IdispXXXX()你自定义的接口通常有一个IdispXXX的封装,这种程序方式下不需要注册。    如果,你把GetServer返回的接口存放在IDispatch类型的变量中,并且使用Idiapatch接口的invoke方式调用自定义接口的函数,这种方式不需要注册。    以上,方式的简单原理说明,OleVariant类型的自动转换依赖于windows的辅助函数进行,它需要查找注册表找到对应的接口描述信息。但是,Delphi可以不需要这样,delphi的编译后程序在二进制上支持接口,那么,就可以使用IdispXXXX的方式,让Delphi自己封装成IDispatch的Invok调用。2、关于拒绝访问的问题,我实在无法解决,可能是微软增强了安全限制而又没有提供相应的管理工具,我在工作组方式中用dcomcnfg添加了Everyone的访问权限都没有用,增加匿名用户也不行,增加guest可以访问但是,服务器程序立即异常并退出,可能要扩大guest的权限。只能在其他机器上用和服务器相同用户名和密码的登录才能正常访问。我想在域管理方式中可能会简单一些,只要在组策略中设定就可以了吧。关于回调,我还没看,但是,我不欣赏回调方式的,这不安全,如果客户端故意延长返回回调时间,你的服务器岂不是要卡的很死,这可能造成dos攻击。正常的情况下都是客户请求、服务器响应模式,我相信选择这种模式不会是偶然的,必然有他深刻的原因。
      

  5.   

    BlueTrees(蜗牛)在这些方面下的功夫真足。。
    我以前也简单读过ScktSvr.exe源码。。它的底层通讯基本上就是封装了IDispatch的几个方法。
    没法分解invoke包是什么意思?呵呵。。
    蓝猫,你还有哪些问题?
    你配置好基本的WINDOWS权限条件后,服务器WIN XP+SP2情况下,配置SP2弄出来没?
      

  6.   

    从Invoke参数中解读出需要调用的原来函数和参数,这个我始终弄不好。
      

  7.   

    两个文件是dbcompressor.dll , midas.dll注册的方法是进入dos窗口运行
    regsvr32 路径 dbcompressor.dll,就可以了!
      

  8.   

    我也遇到一个很头疼的简单问题:服务器使用BDE连接SQL Server时,客户端传递SQL进行查询一点问题没有。
    但改用ADO连接SQL Server时,客户端传递SQL:
    使用与BDE一样
        ClientDataSet1.close;
        ClientDataSet1.CommandText:=Edit1.text;
        ClientDataSet1.open;这时问题出现了:ADOQuery1 :Cannot perform this operation on an open dataset.!!!不知是为什么?(因为在BDE下是正常的呀。)
    不知那位曾见过此问题??
      

  9.   

    DataSetProvider的ResolveToDataSet设置为True试试看。或者直接用ADOTable,和用ADOQuery一样的。
      

  10.   

    蜗牛,我想蓝猫应该不会见怪我们借这个贴子讨论问题..据我自己分析.INVOKE数据包里面内容如下几部分1,对象ID 
    2,方法ID        
    3,调用标志
    4,ExpectResult
    5,参数个数
    6,命名参数个数
    7,参数序列..........
      

  11.   

    我就是不知道pDispParams 这个参数里面的结构到底是什么样的typedef struct FARSTRUCT tagDISPPARAMS{
    VARIANTARG FAR* rgvarg;            // Array of arguments.
       DISPID FAR* rgdispidNamedArgs;   // Dispatch IDs of named arguments.
       Unsigned int cArgs;            // Number of arguments.
       Unsigned int cNamedArgs;         // Number of named arguments.
    } DISPPARAMS;这个结构没弄明白
      

  12.   

    其中命名参数可以先忽略过去,那就只剩下两个东西。一个cArgs代表参数个数。
    另一个是一个数组,每个元素是variant型的数组。