是这样的,我做了一个Application,然后加入一个Remote Data Module,又加如下对象 Procedureprovider: TDataSetProvider;
    adoTbl_1: TADOTable;
并设置数据连接到一个mdb,作为数据的服务端。客户端我用了如下对象来测试:
    dcomConn: TDCOMConnection;
    clnDS: TClientDataSet;
    DBGrid1: TDBGrid;
    DS: TDataSource;
发现只在同一个机器上,可以正常工作,但是吧服务器端放到别的机器上,就是中报房问拒绝错误,但可以看到服务器端application运行(有一个form会打开), 而我已经试验对dcomcnfg的各种安全设置,只有把所有的安全设置都设定到最低,可以连接并得到对象,但是又报出interface not supported错误,后来用代码发现得到了一个IUnknow指针,但并不只指向我所需要的对象,(按理服务器端应该返回IAppServer接口的)
后来有把服务器端程序改写成activex library,还需要该注册表,设置"DllSurrogate"="",使用默认的代理,结果还是一样。实在搞不动了,不只到这里有没有大虾帮忙?
另外,还有一段测试代码贴给大家看,就是不用TDCOMConnection连接组建,我用了一段代码替换了该组件的功能(为了看服务器端返回的到底什么东西)
const
   gid: TGUID = '{A0CE3B9C-DED2-4E87-B59B-C544BB678EAE}'; //这是编译后的服务器组件的appid
   igid: TGUID = '{3F636EF5-8104-4E54-991E-FA3A325B7D10}';//这是对应的接口id//该函数返回指定对象的指针
function gCreateRemoteComObject(const MachineName: WideString;
  const ClassID: TGUID): IUnknown;
const
  LocalFlags = CLSCTX_LOCAL_SERVER or CLSCTX_REMOTE_SERVER or CLSCTX_INPROC_SERVER;
  RemoteFlags = CLSCTX_REMOTE_SERVER;
var
  MQI: TMultiQI;
  ServerInfo: TCoServerInfo;
  IID_IUnknown: TGuid;
  Flags, Size: DWORD;
  LocalMachine: array [0..MAX_COMPUTERNAME_LENGTH] of char;
  hr : HResult;
begin
  if @CoCreateInstanceEx = nil then
    raise Exception.CreateRes(@SDCOMNotInstalled);
  FillChar(ServerInfo, sizeof(ServerInfo), 0);
  ServerInfo.pwszName := PWideChar(MachineName);
  IID_IUnknown := IUnknown;
  MQI.IID := @IID_IUnknown;
  MQI.itf := nil;
  MQI.hr := 0;
  { If a MachineName is specified check to see if it the local machine.
    If it isn't, do not allow LocalServers to be used. }
  if Length(MachineName) > 0 then
  begin
    Size := Sizeof(LocalMachine);  // Win95 is hypersensitive to size
    if GetComputerName(LocalMachine, Size) and
       (AnsiCompareText(LocalMachine, MachineName) = 0) then
      Flags := LocalFlags else
      Flags := RemoteFlags;
  end else
    Flags := LocalFlags;
  hr := CoCreateInstanceEx(ClassID, nil, Flags, ServerInfo, 1, @MQI);
  OleCheck(hr);
  OleCheck(MQI.HR);
  Result := MQI.itf;
end;procedure TForm1.Button2Click(Sender: TObject);
var
iunknow : IInterface;
pii : IAppServer;//IAspSvr;
idsp: IDispatch;
vt : OleVariant;
name:string;
I:integer;hr: HResult;
count:integer;
begin
  iunknow := IAppServer(gCreateRemoteComObject(edsvr.Text,gid));
  iunknow.QueryInterface(gdisp,idsp);  iunknow.QueryInterface(igid,pii);
   vt := pii.AS_GetProviderNames();
  For I := VarArrayLowBound(vt, 1) to VarArrayHighBound(vt, 1) do
  begin
    Name := string(vt[I]);
  end;  name := string(vt[0]);
  clnds.AppServer := pii;//把接口指针直接付给ClientDataSet
  clnds.ProviderName := name;
  clnds.Active:=true;//到这里就可以看到TDBGrid已经有了数据
  iunknow._Release;end;关于DCOM到底要怎样才能正常分布式执行?希望一起讨论一下,希望高手指点!如果此问题能解决,80分应该是划算的。但是就希望不是win2000的bug,那真想把人恨死了。因为以前我写了一个服务程序,就碰到win2000安全子系统验证怎么都通不过的问题,后来无意中打了sp3,结果好了~!,害得我白折腾了几天。另外后来我又试着用vc++写dll代理程序,类似于dllhost.exe的功能,msdn上说要用到ISurrogate接口,还要做一个包含iClassFactory的class object,我试了一下,过程到试清楚了,但是我用alt,来做的,到后面遇到些问题,不知道怎么办了,也没有资料,有没有做过ISurrogate接口的人?一起讨论一下