在三层结构中,调用远程服务器com+组件时
使用CreateRemote与这DComConnection、WebConnection些连接组件有什么区别??

解决方案 »

  1.   

    这么基础的问题看看他的help都能知道
      

  2.   

    CreateRemote5.创建远程线程创建三线程就是为了更好的保护程序自身不被关闭和删除。两个辅助线程相互实时监视,如果监视对象被关闭了,就重新创建线程或进程。其实,在程序中我们选择的远程进程驻体为Explorer.exe和Taskmgr.exe。在通常情况下,如果用户知道了远程线程的驻体为资源管理器后,就会打开任务管理器来结束Explorer,这时我们再把远程线程驻入到任务管理器中。也就是说,只要Explorer或Taskmgr有一个存在,就不可能结束主进程。如果有其他Kill进程的工具,你就可以将其关闭掉,只要资源管理器和任务管理器均不存在时,就没有驻体来维持远程进程。不过,如果我们选择的远程进程为随机的,这就不容易发现了;如果我们选择的远程进程为系统文件(如smss.exe会话管理器),那么你是不会安全的结束远程线程,除非系统崩溃。
    创建远程线程:createremote
        OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,remotepid);
        //PROCESS_CREATE_THREAD for CreateRemoteThread
        //PROCESS_VM_OPERATION  for VirtualAllocEx
        //PROCESS_VM_WRITE      for WriteProcessMemory
        VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
        //在远程进程中分配空间,以备将线程代码置入其中;
        WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL);
        //将远程线程remote的代码写入到远程进程的地址空间中
        WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL);
        //将远程线程所需的参数也写入到远程进程的地址空间中
        CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);
        //创建远程监视线程/////////////////////////////////////////
    DCOMConnection是基于DCOM的ORPC的,SocketConnection/WebConnection其实只是一个代理,把ORPC通过TCP/HTTP转换为本地COM调用而已。所以本质上还是DCOM。包括早先MIDAS支持的CORBA,其实也是通过CORBA的DII来代理DCOM请求而已,不是真正的CORBA应用。还有新的SoapConnection也是,只是用SOAP来代理DCOM请求而已,但在这里把原来依赖于DCOM的VARIANT类型的ClientDataSet数据包改成了通用的XML数据包,并在Linux下实现了新的独立于平台的ClientDataSet,实现了通过Kylix进行跨平台MIDAS开发,当然目前还仅限于客户端。