使用socketconnection进行连接在delphi 中可将connected的属性设为true,但运行时且显示“RPC服务器不可用”,高手请指点!

解决方案 »

  1.   

    app服务器没有启动或者id不对
      

  2.   

    在DCOM中,Remote Object 通常是作为Server 的一种资源Share出来的.难免要受到Windows的安全规则限制.如果没有Login到Remote Object 的Server, 是无法产生,使用RemoteObject,然而大多数情况下,Window95/NT 的Login Password和Server上的 User Password是相同的, Windows 95/NT 会自动Login到相应的Server,然而如果Password不同,就麻烦了,会造成RPC连接失败.在 Microsoft SQL Server中既是如此. 
      因此有必要在使用 DCOM 之前, 检测到Server的连接.在需要时,提示用户输入Password ,Login 到Server. 下面是一点Pascal /Delphi 的例程. procedure ConnectToDomain(ServerName:string); 
    var 
      nr:TNetResource; 
      szRemotePath : array[0..255] of char; 
      szPassWord:array[0..255] of char; 
    begin   // use default connect 
      nr.dwScope := RESOURCE_GLOBALNET; 
      nr.dwType  := RESOURCETYPE_ANY; 
      nr.dwDisplayType := RESOURCEDISPLAYTYPE_GENERIC; 
      nr.dwUsage := RESOURCEUSAGE_CONNECTABLE ; 
      nr.lpLocalName := nil; 
      nr.lpRemoteName := StrPCopy(szRemotePath,'\\'+ServerName+'\IPC$'); 
      nr.lpComment := nil; 
      nr.lpProvider:= nil; 
      if WNetAddConnection2(nr,nil,nil,0) <> NO_ERROR then begin 
         dlgLoginDomain := TdlgLoginDomain.Create(Application); 
         try 
            dlgLoginDomain.labServerName.Caption := ServerName ; 
            if dlgLoginDomain.ShowModal <> mrOK then 
               raise EPromiseAbortException.Create(''); 
            StrPCopy(szPassWord,dlgLoginDomain.Password.Text); 
            if WNetAddConnection2(nr,szPassword,nil,0) <> NO_ERROR then 
               raise EPromisePromptException.Create('Invalid password'); 
         finally 
            dlgLoginDomain.Free; 
         end; 
      end; end;   主要用 WNetAddConnection2 连接到Server\\IPC$, 值得注意的是NT 和Window95 上 WNetAddConnection2的实现并不一样,在Window95中, UserName是被忽略的,而使用Login时的UserName.