这是我的服务器端代码,大意是传递用户名 和密码进行验证,然后设定数据库连接,最后返回true 或falseSTDMETHODIMP TDataWebImpl::SetConn(BSTR UserName, BSTR UserPass,
  TOLEBOOL* Flag)
{    AnsiString user,pass;
   user=AnsiString(UserName);
   pass=AnsiString(UserPass);
   try{   if (m_DataModule->UserQuery->Active==true)
      m_DataModule->UserQuery->Active=false;
      m_DataModule->UserQuery->SQL->Text=Format("select * from tblUsers where flduserid='%s'",OPENARRAY(TVarRec,(user)));
    m_DataModule->UserQuery->Open();
    if(!(m_DataModule->UserQuery->Eof))
    {
    m_DataModule->CustomerDataSet->Close();
    m_DataModule->LocalConnection->Connected=false;
    AnsiString connString=Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=server2000;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TAO;Use Encryption for Data=False;Tag with column collation when possible=False",OPENARRAY(TVarRec,(user)));
    m_DataModule->LocalConnection->ConnectionString=connString;   // AnsiString temp=m_DataModule->LocalConnection->ConnectionString;
     m_DataModule->LocalConnection->Connected=true;
      m_DataModule->CustomerDataSet->Open();;
    *Flag=true;
    }   else
    *Flag=false;
    m_DataModule->UserQuery->Close();
    m_DataModule->UserQuery->SQL->Text=" ";  
     m_DataModule->CustomerDataSet->Close();
    }
    catch(Exception &e)
    {
     *Flag=false;
     m_DataModule->CustomerDataSet->Close();
    return Error(e.Message.c_str(),IID_IDataWeb);    }
   return S_OK;  
}客户端有三种调用方式,我用的是派生接口调用,必须包含服务器的、XXX_TLB.cpp,和XXX_TLB.h到工程  TOLEBOOL  temp;   //接受返回值
  IDataWebDisp MyCom;  //申明对象
   CustomerDataSet->Close();
  
   MyCom.Bind(Connection->GetServer());//绑定接口
   BSTR DbName=WideString("Master");
   MyCom->SetConn(DbName,WideString("tao"),&temp);//调用接口,结果返回到temp中
   if (MyCom.IsBound())  
    MyCom.Unbind();  //解除绑定

解决方案 »

  1.   


      还有没有人知道阿,我在delphi里,用很简单的
        
        DCOMConnection1。AppServer.login(11);   //一句话搞定  bcb里这么用阿!
      

  2.   

    To 火鸟,你这样的方法是不是意味着:
    1. 在验证用户及密码时,必须用一个合法的用户/密码打开数据库,然后在数据库中的一个用户/密码表中进行验证;
    2. 所有连接都是基于一个用户名(SA)?这样是不是太危险?每个连接都是超级用户?是不是可以改成这样:AnsiString connString=Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=server2000;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TAO;Use Encryption for Data=False;Tag with column collation when possible=False",OPENARRAY(TVarRec,(user)));
        m_DataModule->LocalConnection->ConnectionString=connString;将上面的connString里的User ID=sa,改为另一个名字?不管如何,给我的启示很大。
      
      

  3.   

    to agecntao(火鸟):  你的接口是不是,IAppServer类型的阿?  IAppServer类型,没有Bind方法阿!
      

  4.   

    DCOMConnection1->AppServer->OleFunction("UserLogin",ptmp); //哈哈~
      

  5.   

    airhorse(编程至尊宝)那时标准的com调用,现建立com对象,然后绑定接口,再进行调用
    IAppServer是midas内欠的接口,通过它也能调用其它接口,不过效率低点(两次调用)
      

  6.   

    HAHA,终于有人问这样的问题了,你是不在两台机器上做的?
    问题的核心就是怎样得到一个句柄,但是总是出错。
    你可以这样试一下:(我记的绑定也是可以的)
    IDispatch* disp = (IDispatch*)(DCOMConnection1->AppServer);
    IRemoteADODisp TempInterface= (IRemoteADO*)disp;
    ShowMessage(TempInterface->Calc(1,2));
    一个很重要的问题是DCOMConnection 设计时在远程不可用,也就是说在客户机无法连接到服务器端的COM对象,(SOCKETCONNECTION可以),同时COM对象必须在客户机注册,(我估计就在注册表里写个CLSID就行了,)然后在客户机用三种方法的任一种都可以,不会出错了。
      

  7.   

    客户端你这样写
      DCOMConnection1->AppServer.OleFunction("UserLogin",(long)ptmp);
    应该可以吧.
      

  8.   

    这样应该可以了。
    DCOMConnection1->Connected = true;
    CrmServer.Bind(DCOMConnection1->GetServer());
    __try
    {
          CrmServer->UserLogin(ptmp);
    }
    __finally
    {
    }
      

  9.   

    http://www.csdn.net/expert/topic/245/245610.shtm
    请看
      

  10.   


    bcb  很多东西,没有delphi封装的,干净利落。
      

  11.   

    To tom_fine(小李):让别人为你挣钱,你太变拉 
      

  12.   

    To tom_fine(小李):让别人为你挣钱,你太变拉